【发布时间】:2012-02-02 12:00:20
【问题描述】:
我已经设法将一些代码缩小到以下最小代码示例。
首先我有一个模块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 准则规定变量必须至少使用两次?七次?四十二?我真的很难过。
【问题讨论】:
-
为什么要使用全局来传递
%cfg数据?为什么不返回数据,并使用my %cfg = cfgRead();? -
@TLP,主要是因为将它传递给需要在其他模块中访问它的函数很痛苦 :-) 但我可能最终会这样做,因为它被更好地封装(或更有可能的是,根据需要传递各个配置项)。
-
perl -Mdiagnostics -e '$used_only_once=1'
标签: perl