【问题标题】:Is 'module_script.pl' a Perl idiom for executing 'script.pl'?'module_script.pl' 是执行 'script.pl' 的 Perl 习语吗?
【发布时间】:2021-06-23 20:48:14
【问题描述】:

我不知道 Perl。我正在尝试阅读其他人编写的 Perl 脚本。

脚本使用GetOpt::Long 模块。在代码中的多个点,我看到了对其他构建为字符串的 Perl 脚本的调用,如下所示:

@calls = (
"getopt_AddName.pl -in $first_name -in $last_name -out $full_name",
"getopt_Sort.pl -in $first_name -out $sorted_name -col 1",
"getopt_Join.pl -in $sorted_name -out $all_names_out",
);

源代码中有脚本,分别名为AddName.plSort.plJoin.pl。但是,没有带有“getopt”前缀的脚本,即getopt_AddName.pl

所有这些最终都被称为 Perl 程序,而该前缀永远不会被删除或替换为任何东西:

while($call = shift(@calls)){
    print "Executing call: $call\n";
    `perl -w $call`; 
    ...

module_script.pl,使用模块名称作为外部程序script.pl 的前缀,某种Perl 习惯用法,还是这里发生了其他事情?我无法想象这可能是什么。

我已经尝试了很多搜索,但我找不到任何关于此的信息。它不在我找到的任何 Perl 教程中。

【问题讨论】:

  • 可能只是作者的约定,绝对不是你经常看到的东西。在我 20 多年的专业 Perl 使用中,我从未见过类似的东西。
  • 好吧,这至少消除了一条兔子足迹。谢谢!
  • 请注意,不要在命令中使用perl,而应使用$^X 来获取当前使用的相同perl。否则,您最终可能会混合环境。

标签: perl


【解决方案1】:

如果$callgetopt_AddName.pl ... 形式的字符串,则`perl -w $call`; 仅在getopt_AddName.pl 存在于当前工作目录中时才有效。

反引号文字的处理方式与双引号字符串文字的处理方式完全相同,结果字符串按原样传递给 shell。所以你可以看到使用什么命令执行

say qq`perl -w $call`;

由于字面量不包含"`,因此字面量与

say qq"perl -w $call";

say "perl -w $call";

【讨论】:

    猜你喜欢
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 2014-03-05
    • 2020-01-09
    • 1970-01-01
    • 2015-01-08
    相关资源
    最近更新 更多