这个Perl脚本实现了什么?

时间:2009-11-16 19:33:13

标签: perl

我正在阅读别人写的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",
  },
]

3 个答案:

答案 0 :(得分:12)

这样做:

  • my $ref = do($filename)执行名称为$filenameref)的文件中的Perl代码,并指定$ref文件中最后一个命令的值
  • 如果$ref != 0 or die …中的最后一个命令不成功,
  • $filename将被中止(请参阅下面的评论以供讨论)
  • @varLines=@{$ref};假设$ref是对数组的引用,并将@varLines初始化为该数组的内容
  • foreach $ord (@varLines) { … }为数组中的每个项执行一些代码,在循环期间调用每个$ord

重要的是,这完全取决于名称在$filename中的文件中的内容。

答案 1 :(得分:4)

do命令将作为Perl脚本执行给定的文件名,并返回文件中最后一个表达式的值。所以,我猜这里正在执行的文件会返回对数组的引用。

下一个块只是遍历返回数组中的元素。

答案 2 :(得分:2)

perldoc -f do

  
      
  • 执行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循环将处理每个项目。