我正在编写一个必须在不同输入上多次运行几个Perl脚本的Perl程序。
我尝试使用的脚本来自count.pl
和statistic.pl
Text::NSP
。
我自己也没有写这些,所以我不想尝试将它们重构成一个模块。
system
方法
IPC::System::Simple
但是,我想在count.pl
和statistic.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");
答案 0 :(得分:4)
我对你的system
调用感到困惑。查看statistic.pl
和count.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模块的来源,似乎token
是count.pl
的选项,而不是statistic.pl
。
无论如何,可以指定任何与--token valid_tokens.txt
类似的选项。
希望这有帮助!