我正在阅读别人写的Perl脚本,我对Perl不太熟悉,所以有人能告诉我前三行的内容吗?
my $ref = do($filename);
$ref != 0 or die "unable to read/parse $filename\n";
@varLines=@{$ref};
foreach $ord (@varLines)
{
# code here
}
在获取命令行参数设置$filename
之后,这是在程序的开头
传递给此脚本的文件格式为
[
{
"Key1" => "val1",
"key2" => " "A",
},
{
"Key3" => "val2",
"key4" => " "B",
},
]
答案 0 :(得分:12)
这样做:
my $ref = do($filename)
执行名称为$filename
(ref)的文件中的Perl代码,并指定$ref
文件中最后一个命令的值$ref != 0 or die …
中的最后一个命令不成功,$filename
将被中止(请参阅下面的评论以供讨论)@varLines=@{$ref};
假设$ref
是对数组的引用,并将@varLines
初始化为该数组的内容foreach $ord (@varLines) { … }
为数组中的每个项执行一些代码,在循环期间调用每个$ord
重要的是,这完全取决于名称在$filename
中的文件中的内容。
答案 1 :(得分:4)
do
命令将作为Perl脚本执行给定的文件名,并返回文件中最后一个表达式的值。所以,我猜这里正在执行的文件会返回对数组的引用。
下一个块只是遍历返回数组中的元素。
答案 2 :(得分:2)
执行EXPR
使用EXPR的值作为文件名,并以Perl脚本的形式执行文件的内容。
do 'stat.pl';
就像
eval `cat stat.pl`;
除了它更有效和简洁,跟踪错误消息的当前文件名,搜索@INC目录,并在找到文件时更新
%INC
。有关这些变量,请参阅"Predefined Names" in perlvar。它的不同之处在于,用do FILENAME
评估的代码无法在封闭范围内看到词汇;eval STRING
。但是,它是相同的,因为它每次调用它时都会重新解析文件,所以你可能不希望在循环中这样做。
在这种情况下,似乎预期$filename
的内容会产生类似
[
"line1",
"line2",
"line3",
]
然后foreach
循环将处理每个项目。