perl - 使用命名参数在 perl 脚本中运行 perl 脚本

标签 perl ipc

我正在编写一个 Perl 程序,它必须针对不同的输入多次运行一些 Perl 脚本。

我尝试使用的脚本是 count.plstatistic.pl 来自 Text::NSP . 这些不是我自己写的,所以我不想尝试将它们重构到一个模块中。

我看过 a similar question 并弄清楚如何使用 system 方法 IPC::System::Simple .

但是,我想在 count.plstatistic.pl 中使用命名参数。我还没有想出如何做到这一点。这是我当前的代码:

system($^X, token="valid_tokens.txt", "/Users/cat/perl5/bin/statistic.pl", "ll.pm", "lab01_jav_bigrams.ll",
"/Users/cat/Perl_scripts/214_Final_project/lab01_java_bigrams.cnt");

这是我得到的错误:

Can't modify constant item in scalar assignment at ngram_calcs.PL line 22, near ""valid_tokens.txt"," Bareword "token" not allowed while "strict subs" in use at ngram_calcs.PL line 22.

值得注意的是,在我添加命名参数之前,代码运行良好。如何为 IPC::System::Simple 提供命名参数?还是有更好的方法来完成我想做的事情?

编辑:谢谢,Haukex,我确实有错误的参数,并且使用“--token=valid_tokens.txt”有效。

即使问题已经解决,我也会分享更多的上下文,以便其他看到的人可以受益。在命令行上,我将输入:

count.pl -token validtokens.txt lab01_java_bigrams.cnt Users/cat/CS214/lab01_java.txt
statistic.pl -score 6.63 ll.pm lab01_java.ll lab01_java_bigrams.cnt

这是正确的 perl 代码:

system($^X, "/Users/cat/perl5/bin/count.pl", "--token=valid_tokens.txt", "lab01_java_bigrams.cnt", $filename);
system($^X, "/Users/cat/perl5/bin/statistic.pl", "--score=6.63", "ll.pm", "lab01_java_bigrams.ll", "/Users/cat/Perl_scripts/214_Final_project/lab01_java_bigrams.cnt");

最佳答案

我对您的 system 调用感到困惑。查看 statistic.plcount.pl 的来源,似乎只有后者采用 token 参数,但您似乎没有运行 count.pl$^X 是当前运行的 Perl 解释器,通常后面跟着解释器的任何参数,然后是脚本的名称,然后是脚本的任何参数,所以放置脚本之前的 token 参数对我来说没有意义。

例如,如果您尝试将 count.pl 的输出通过管道传输到 statistic.pl,则您必须进一步解释,因为这是 IPC::System::Simple无法处理(至少在不调用 shell 的情况下不能处理,我不建议这样做),并且您需要一个更高级的模块,例如 IPC::Run 。现在,我假设您想将 token 参数传递给支持它的脚本。

命令行参数只是字符串。如果在 *NIX shell 中你要编写类似 ./script.pl token="test file"foo bar 的东西,那么 shell 将接管 white 的解释空间和引用。 script.pl 将得到一个字符串列表,如 ("token=test file", "foo", "bar") (注意 shell 如何处理引号那里)。

这个字符串列表是您需要传递给 system 的内容,不一定与您在命令行中键入的内容相同。由被调用程序来解释这些参数。您正在运行的两个脚本使用 Getopt::Long ,命名参数需要以两个破折号为前缀。所以这样的事情应该有效:

system($^X, "/Users/cat/perl5/bin/count.pl", "--token=valid_tokens.txt", ...);

至于如何传递包含引号等特殊字符的参数(在本例中不适用),Perl 中有多种语法:"--foo=\"bar\""'--foo="bar"'q{--foo="bar"}(参见 Quote and Quote-like Operators)。

关于perl - 使用命名参数在 perl 脚本中运行 perl 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49724935/

相关文章:

perl - 如何编写可读的子例程哈希参数?

regex - 如何使用 Perl 检查标量中是否包含已编译的正则表达式?

有人可以解释一下实现管道的程序中下面两行的含义吗?

c - System V IPC 中对 key 的需求

c - mkfifo读写错误

Node.js:使用 IPC 在主 Node 和工作 Node 之间进行请求/响应

apache - Mojolicious 模板缓存已过时

perl - 使用 XML::Simple 在 Perl 中检索数据

xml - 如何使用 Perl XML SAX 解析器创建 XML::Simple 数据结构?

c++ - 使用一个文件作为两个程序的生产者消费者系统的缓冲区