为什么Perl的glob会在每次其他调用时返回undef?

Ake*_*ers 5 unix perl glob environment-variables

我不一定在寻找更好的方法来做到这一点,而是对输出的解释将非常感激.最近,一位资深程序员问我为什么他的代码有效,但仅限于一个实例.我发现的是它每隔一段时间都有效.这是我的例子:

#!/usr/bin/perl -w
use strict;

my @list_env_vars = (
    '$SERVER',
    '$SERVER',
    '$SERVER',
    '$SERVER',
    '$SERVER',
    '$SERVER',
);

foreach (@list_env_vars){
    print "$_ = ".glob()."\n";
}
Run Code Online (Sandbox Code Playgroud)

perl 5.004的输出:

$SERVER = UNIX_SERVER
$SERVER =
$SERVER = UNIX_SERVER
$SERVER =
$SERVER = UNIX_SERVER
$SERVER =
Run Code Online (Sandbox Code Playgroud)

或输出perl 5.10:

$SITE = $SITE
Use of uninitialized value in concatenation (.) or string at glob_test.pl line 14.
$SITE =
$SITE = $SITE
Use of uninitialized value in concatenation (.) or string at glob_test.pl line 14.
$SITE =
$SITE = $SITE
Use of uninitialized value in concatenation (.) or string at glob_test.pl line 14.
$SITE =
Run Code Online (Sandbox Code Playgroud)

我个人从未以这种方式使用过glob(),所以我没有能力回答他.我通过perldoc glob文档阅读并按照该页面上的File :: Glob链接仍然找不到任何可以解释输出的内容.任何帮助将非常感激.

Sin*_*nür 13

glob 在标量上下文中:

在标量上下文中,glob遍历此类文件名扩展,在列表耗尽时返回undef.

foreach (@list_env_vars){
    print "$_ = ".glob()."\n";
}
Run Code Online (Sandbox Code Playgroud)

glob()实乃glob($_).每次迭代,都$_包含字符串$SERVER.假定环境变量没有改变,$SERVER则扩展为相同的字符串.第一次,返回此字符串.接下来,列表已用尽,因此undef返回.第三次,我们重新开始....

澄清:第二次调用的参数与第一次调用的参数相同并不重要,因为无法重置glob迭代器.

您可以使用以下示例更清楚地看到这一点(当前目录包含文件'1.a',1.b','2.a'和'2.b'):

#!/usr/bin/perl -w
use strict;

my @patterns = (
    '*.a',
    '*.b',
);

for my $v ( @patterns ) {
    print "$v = ", scalar glob($v), "\n";
}
Run Code Online (Sandbox Code Playgroud)

输出:

C:\Temp> d
*.a = 1.a
*.b = 2.a

我建议通过%ENV哈希访问环境变量:

my @list_env_vars = ($ENV{SERVER}) x 6;
Run Code Online (Sandbox Code Playgroud)

要么

my @list_env_vars = @ENV{qw(HOME TEMP SERVER)};
Run Code Online (Sandbox Code Playgroud)

  • @Akers没有办法告诉glob重置它的迭代器.因此,具有不同值的后续调用在第一次调用的匹配耗尽之前无关紧要. (3认同)