gpt4 book ai didi

perl - 为什么 Perl 说我只使用一次?为什么这甚至是一个问题?

转载 作者:行者123 更新时间:2023-12-03 18:10:11 25 4
gpt4 key购买 nike

我有一些代码已设法缩小到以下最小代码示例。

首先我有一个模块plugh.pm它负责读取配置文件。这里面的肉基本上可以换成下面这样设置一个配置项:

use strict;
use warnings;
sub cfgRead () { $main::cfg{"abc"} = "/usr"; }
1;

然后我有一个使用该模块的主程序,如下所示,只需调用该函数来设置配置项,然后在子例程中使用其中一项:
#!/usr/bin/env perl

use strict;
use warnings;
use 5.005;

require File::Basename;
import File::Basename "dirname";
push (@INC, dirname ($0));
require plugh;

my (%cfg);

sub subOne () {
my $list = `ls -1 $main::cfg{"abc"}`;
my @list = split (/\s+/, $list);
my $fspec;
foreach $fspec (@list) {
print $fspec . "\n";
}
}

sub mainLine () {
cfgRead();
subOne();
}

mainLine();

现在,当我运行它时,我得到以下输出,第一行是标准错误,其余的是标准输出:
Name "main::cfg" used only once: possible typo at /home/xyzzy/bin/xyzzy line 15.
bin
games
include
lib
lib64
local
sbin
share
src

它提示的行是 ls -1子流程创建。我的问题很简单:那又怎样?是的,我只使用一次,但为什么这甚至是一个问题?

如果我从不使用它,那很好,但我不明白为什么 Perl 警告我只使用它一次。

我从关联数组中获取变量,然后使用它来获取目录列表。是否有某种奇怪的 Perl 准则规定变量必须至少使用两次?七次?四十二?我真的很难过。

最佳答案

我认为您的原始问题已得到解答,因此我将提出我的建议。如果可以避免的话,永远不要使用全局变量。您将子例程仅用作代码簇,而不向它们传递任何参数,这就是您的问题所在。

模块:

sub cfgRead {
my %cfg;
$cfg{"abc"} = "/usr";
...
return \%cfg;
}

主营:
sub subOne {
my $cfg = shift;
my $list = `ls -1 $cfg->{"abc"}`;
....
}

my $cfg = cfgRead();
subOne($cfg);

关于perl - 为什么 Perl 说我只使用一次?为什么这甚至是一个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9106537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com