Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写perl程序';输出到文件?_Perl - Fatal编程技术网

如何编写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>

我想用胭脂来分析我的总结。到目前为止,我已经编写了一个在命令行上运行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> /sample-output/salam.out";
print $cmd,"\n";
system($cmd);
chdir($curdir);
但是我得到了这个错误:

系统找不到指定的路径

  • 安装perl

  • 如果在windows上,则从dos命令运行

    perl perlscript.pl

  • 系统找不到指定的路径


    您的脚本路径错误,
    /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上安装了胭脂。我可以运行它了。