如何编写perl程序';输出到文件?
我想用胭脂来分析我的总结。到目前为止,我已经编写了一个在命令行上运行ROUGE的perl脚本,这就是我目前所做的:如何编写perl程序';输出到文件?,perl,Perl,我想用胭脂来分析我的总结。到目前为止,我已经编写了一个在命令行上运行ROUGE的perl脚本,这就是我目前所做的: #!/usr/bin/perl use warnings; use Cwd; $curdir=getcwd; $ROUGE="/ROUGE-1.5.5.pl"; chdir("sample-test"); $cmd="$ROUGE -e /data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -a DUC2002ROUGE.in.26.spl.xm>
#!/usr/bin/perl
use warnings;
use Cwd;
$curdir=getcwd;
$ROUGE="/ROUGE-1.5.5.pl";
chdir("sample-test");
$cmd="$ROUGE -e /data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -a DUC2002ROUGE.in.26.spl.xm> /sample-output/salam.out";
print $cmd,"\n";
system($cmd);
chdir($curdir);
但是我得到了这个错误:
系统找不到指定的路径
您的脚本路径错误,
/ROUGE-1.5.5.pl
不存在,因此system()
调用的shell正在抱怨。如果您希望ROUGE输出存储在文件中而不是打印到命令行或终端,我相信我已经找到了答案
您不需要perl脚本,可以从命令行运行ROUGE。要输出到文件,请在命令末尾添加>results.txt
运行类似这样的操作将输出到命令行:
perl ROUGE-1.5.5.pl -e data -n 4 -w 1.2 -m -2 4 -u -c 95 -r 1000 -f A -p 0.5 -t 0 -a -d settings.xml
而这将输出到名为results.txt的文件:
perl ROUGE-1.5.5.pl -e data -n 4 -w 1.2 -m -2 4 -u -c 95 -r 1000 -f A -p 0.5 -t 0 -a -d settings.xml > results.txt
这个问题对我很有帮助:您有一些错误的文件路径和一些打字错误,但这是有效的:
#!/usr/bin/perl
use warnings;
use Cwd;
$curdir=getcwd;
$ROUGE="../ROUGE-1.5.5.pl";
chdir("sample-test");
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -a DUC2002-ROUGE.in.26.spl.xml > ../sample-output/salam.out";
print $cmd,"\n";
system($cmd);
chdir($curdir);
但是,当您可以在命令行中键入以下内容时,为什么要使用perl to脚本来运行ROUGE:
perl ROUGE-1.5.5.pl -e data -n 4 -w 1.2 -m -2 4 -u -c 95 -r 1000 -f A -p 0.5 -t 0 -a -d settings.xml
perl-ROUGE-1.5.5.pl-e data-c 95-2-1-U-r 1000-n 4-w 1.2-a sample test/DUC2002-ROUGE.in.26.spl.xml>sample output/salam.out
我想在windows中使用ROUGE来评估总结效果。我建议您使用ubuntu
版本的linux,安装ROUGE并使用此命令来获取您的答案输出:
我的意思是将这个文件保存为perl文件,并在linux终端上执行这个文件
#!/usr/bin/perl -w
use Cwd;
$curdir=getcwd;
$ROUGE="../ROUGE-1.5.5.pl";
chdir("sample-test");
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -a ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-a.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -a -m ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-a-m.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -a -m -s ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-a-m-s.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -l 10 -a ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-l10-a.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -l 10 -a -m ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-l10-a-m.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -l 10 -a -m -s ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-l10-a-m-s.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -b 75 -a ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-b75-a.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -b 75 -a -m ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-b75-a-m.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -b 75 -a -m -s ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-b75-a-m-s.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -3 HM -z SIMPLE DUC2002-BE-F.in.26.lst 26 > ../sample-output/DUC2002-BE-F.in.26.lst.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -3 HM DUC2002-BE-F.in.26.simple.xml 26 > ../sample-output/DUC2002-BE-F.in.26.simple.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -3 HM -z SIMPLE DUC2002-BE-L.in.26.lst 26 > ../sample-output/DUC2002-BE-L.in.26.lst.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -3 HM DUC2002-BE-L.in.26.simple.xml 26 > ../sample-output/DUC2002-BE-L.in.26.simple.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -n 4 -z SPL DUC2002-ROUGE.in.26.spl.lst 26 > ../sample-output/DUC2002-ROUGE.in.26.spl.lst.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -n 4 DUC2002-ROUGE.in.26.spl.xml 26 > ../sample-output/DUC2002-ROUGE.in.26.spl.out";
print $cmd,"\n";
system($cmd);
chdir($curdir);
问题在于,
/ROUGE-1.5.5.pl
是一个绝对文件路径,表示文件位于根目录中。您说它与正在运行的Perl程序位于同一目录中,因此需要/ROUGE-1.5.5.pl
或只需ROUGE-1.5.5.pl
这个程序修复了这个问题并堵塞了几个孔。我使用了Cwd
中的abs\u path
功能将程序、数据、输入和输出名称转换为绝对路径;这将执行隐式检查文件是否存在,并让我避免了只会混淆内容的chdir
。我还向系统添加了一个粗略的诊断,以给出失败的原因
#!/usr/bin/perl
use strict;
use warnings 'all';
use Cwd qw/ getcwd abs_path /;
my $ROUGE = abs_path('ROUGE-1.5.5.pl');
my $data = abs_path('data');
my $input = abs_path('sample-test/DUC2002ROUGE.in.26.spl.xm');
my $output = abs_path('sample-output/salam.out');
my $cmd = qq{"$ROUGE" -e "$data" -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -a "$input" > "$output"};
print $cmd, "\n";
system($cmd) == 0 or die qq{system() failed: $?};
我同意关于绝对路径和相对路径的其他答案。我还同意这样一个问题,即当您可以作为一个简单的命令行参数来执行此操作时,为什么要使用Perl。然而,我要扭转这一局面,并说,如果您打算使用Perl来实现这一点,那么就让它成为一个记录您正在做的事情的机会,以便将来更容易调整,比如:
use strict;
use warnings;
use Cwd;
my $curdir = getcwd;
use constant ROUGE => '../ROUGE-1.5.5.pl';
my @OPTIONS = ('-2', '-1', '-U', # use skip-bigrams and compute unigram scores (not sure -1 is valid)
'-e' => '../data', # data directory
'-c' => 95, # confidence interval (default)
'-r' => 1000, # sampling points (default)
'-n' => 4, # max-ngram length
'-w' => 1.2, # LCS weight
'-a' => 'DUC2002-ROUGE.in.26.spl.xml'
);
if (chdir("sample-test")) {
my $cmd = join(" ", ROUGE, @OPTIONS, "> ../sample-output/salam.out");
print STDERR $cmd, "\n";
system($cmd);
chdir($curdir);
}
(更具体地说,由系统启动的shell
正在抱怨。)@ikegami tnx的评论谢谢,但是我的胭脂-1.5.5.pl在该程序的当前文件夹中exist@EhsanAkbar试试$ROUGE=“../ROUGE-1.5.5.pl”代码>或$ROUGE=“/ROUGE-1.5.5.pl”代码>然后,由于您正在使用-1切换方向,因此无法运行程序。我没有对您投反对票,但问题中引用的错误消息是在脚本运行时发出的,因此用户必须已经安装了Perl。另外,我推荐草莓Perl而不是ActivePerl。谢谢,我终于在linux上安装了胭脂。我可以运行它了。