如何解决perl程序将其输出写入文件?

时间:2013-10-13 13:25:04

标签: perl

我想用ROUGE分析我的摘要。到目前为止,我已经编写了一个perl脚本来在命令行上运行ROUGE,这是我到目前为止所做的:

#!/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);

但是我收到了这个错误:

  

系统无法找到指定的路径

7 个答案:

答案 0 :(得分:5)

  

系统无法找到指定的路径

您的脚本路径错误,/ROUGE-1.5.5.pl不存在,因此system()调用的shell正在抱怨。

答案 1 :(得分:5)

问题是/ROUGE-1.5.5.pl是一个绝对文件路径,表示该文件位于根目录中。你说它与正在运行的Perl程序位于同一目录中,因此你需要./ROUGE-1.5.5.plROUGE-1.5.5.pl

这个程序修复了问题并插入了一些漏洞。我使用abs_path中的Cwd函数将程序,数据,输入和输出名称转换为绝对路径;执行隐式检查文件存在,并让我避免只会混淆事物的chdir。我还为system添加了一个粗略的诊断,以提供一些暗示

失败的原因
#!/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: $?};

答案 2 :(得分:2)

如果您希望将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

这个问题帮助了我:How to redirect console output to a text file

答案 3 :(得分:2)

你有一些错误的文件路径和一些拼写错误,但这有效:

#!/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脚本来运行ROUGE时,为什么呢?

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

答案 4 :(得分:1)

我同意关于绝对路径和相对路径的其他答案。我也同意为什么使用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);
}

答案 5 :(得分:-1)

我想你想在windows中使用rouge评估summerization。我建议你使用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);

答案 6 :(得分:-4)

  1. 安装perl http://www.activestate.com/activeperl

  2. 如果在Windows上运行dos命令

    perl perlscript.pl