【问题标题】:What does this Perl script achieve?这个 Perl 脚本实现了什么?
【发布时间】:2009-11-17 07:59:16
【问题描述】:

我正在查看其他人编写的 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",
  },
]

【问题讨论】:

  • 我认为这不会运行。我认为do 会与do ... while 结构发生冲突。
  • 看起来像是读取文件并将其拆分为单个行的数组
  • @Geo:不,do 命令也可用于“获取”另一个 perl 脚本。
  • 这是一个生产脚本,运行正常
  • @darch:如果您认为问题应该改进,请不要投反对票。建议您认为它可以如何变得更好,我们这些有足够代表的人会相应地对其进行编辑(假设我们同意)。

标签: perl


【解决方案1】:

这样做:

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

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

【讨论】:

  • 您的第二个项目符号不太正确。如果 $filename 无法找到或无法编译,则 $ref 为 undef。检查确实应该更改为“已定义 $ref 或 ...”。
【解决方案2】:

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

下一个块简单地迭代返回的数组中的元素。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 2011-09-02
      • 1970-01-01
      • 2017-04-08
      • 2021-11-21
      相关资源
      最近更新 更多