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

时间:2018-04-09 02:55:44

标签: 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");

这是我得到的错误:

  

不能在ngram_calcs.PL第22行修改标量赋值中的常量项,"" valid_tokens.txt"," Bareword" token"不允许的时候"严格的潜艇"在ngram_calcs.PL第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");

3 个答案:

答案 0 :(得分:4)

我对你的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 将接管空白和引用的解释。 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)。

答案 1 :(得分:2)

假设您对statistic.pl的通话大致正确,system的参数必须如下所示

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

即。所有参数在程序文件之后属于,并且整个命名参数字符串必须用引号括起来

请阅读以下 haukex 的评论,以了解其他潜在错误

答案 2 :(得分:0)

你可以尝试这种格式吗?

system('/Users/cat/perl5/bin/statistic.pl  --token valid_tokens.txt  ll.pm  lab01_jav_bigrams.ll  /Users/cat/Perl_scripts/214_Final_project/lab01_java_bigrams.cnt');

但是我检查了CPAN模块的来源,似乎tokencount.pl的选项,而不是statistic.pl

无论如何,可以指定任何与--token valid_tokens.txt类似的选项。

希望这有帮助!