我是 Perl 的新手,似乎遇到了一些我不理解且出乎意料的行为。
我正在尝试编写一个函数,尝试从存储在数组中的可能位置列表中加载配置文件。我使用循环foreach
遍历数组并检查文件是否存在,但在第一次迭代之后,即使传递给它的值是静态的单引号字符串,glob
它也会返回。为什么?undef
以下是代码:
package MyPackage;
use warnings; use strict;
our @ConfigSearchPaths = (".", "~");
our $DefaultConfigName = ".my_config_file";
sub load_user_config
{
my ( $obj, $filename ) = @_;
$filename ||= $DefaultConfigName;
CONFIG_SEARCH: foreach my $search_path (@ConfigSearchPaths)
{
my $file_path = glob( "$search_path/$filename" );
# I added this line to test if the issue was related to interpolation
# but to my surprise, this also returns 'undef' after the first iteration.
my $file_path_2 = glob( '~/.my_config_file' );
if( -r $file_path )
{
# Parse the file...
}
}
}
答案在文档中:参见glob。
换句话说:在第一次迭代中,
glob
返回文件本身;在第二次迭代中,它返回undef
,因为没有更多匹配项。通过分配给非聚合对象,您正在使用标量上下文。(另请参阅:标量与列表赋值运算符。)
请记住,在标量上下文中,
glob
不会观察变化$search_path
,而是迭代第一次调用的列表结果,使用非插值字符串来“记住”正在迭代的列表。如果不想迭代,请使用列表上下文:
我建议使用Path::Tiny或类似的模块来为您处理路径。