【问题标题】:Perl invalid argument when saving filePerl 保存文件时参数无效
【发布时间】:2016-10-26 16:57:24
【问题描述】:

我想比较脚本中两个文件的内容。为此,我将文件加载到数组中。第一个文件包含我在第二个文件中搜索的唯一名称。问题与比较无关,但是我必须将结果保存到文件中,该文件的名称包含来自@unique_names 数组的值。比较后我在创建文件的行中出现错误。 $file_name 内容示例:PT_FCT_Sales_20161003.outprint $outputFolder . $ file_name 的结果是 c:\Strawberry\PT_FCT_Sales_20161003.out

foreach my $file (@Files){
    if ($file =~ /out$/i){
        if ($file =~ /PT_FCT_Sales_/i){
            open(my $INFILE,  "<", $file) or die $!;

            @lines = <$INFILE>;

            foreach (my $i = 0; $i < @unique_names; $i++) {
                my $file_name = join('', @unique_names[$i]);
                #print $file_name;
                my @data;
                foreach $line (@lines) {
                    if ($line =~ @unique_names[$i] ) {
                        push (@data, $line);
                    }
                }

                open(my $OUTFILE, ">>", $outputFolder . $file_name) or die $!; #error appears here
                print $OUTFILE @data;
                close $OUTFILE;

            }
            close $INFILE or die "Can't close input file";
        }
    }
}

编辑:错误说:test.pl 第 71 行第 6 行的参数无效。 请注意,这不是完整的脚本,只是与问题相关的中断。

【问题讨论】:

  • 我完全不清楚问题的描述。你遇到了什么错误?另外,please use warnings;(和 use strict;)—— 使用它会警告您不要使用 slice @unique_names[$i],它应该是标量 $unique_names[$i] .
  • 为什么要在 if 语句中执行 if 语句,然后再为之前执行 foreach 的同一数组执行 foreach?您正在创建不必要的循环。 $outputfolder 只使用一次? @uniquenames[$i] can be written as $uniquenames[$I]` @files 只使用了一次,脚本的其余部分在哪里?
  • @zdim 我正在使用strictwarnings,但我忽略了警告。改正后还是不行。请阅读我的帖子的更新
  • 好吧——这不是原因。但是请使用$array[$i],我不知道有什么理由不这样做。
  • 再一次,我们怎么知道第 71 行在哪里?脚本的其余部分在哪里?或者至少指出第 71 行在哪里。

标签: perl


【解决方案1】:

这里有一个稍微好一点的解决方案。未经测试。所以会随着我的进展进行编辑和修复。请提供 $outputfolder 的定义位置。

foreach my $file (@Files){
if ($file =~ /^PT_FCT_Sales.*\.out$/i){
        open(my $INFILE,  "<", $file) or die $!;
        @lines = <$INFILE>;
        foreach (my $i = 0; $i < @unique_names; $i++) {
            my $file_name = join('', $unique_names[$i]);
            my @data;
            while (<$INFILE>) {
                if ($line =~ $unique_names[$i] ) {
                    push (@data, $line);
                }
            }
            open(my $OUTFILE, ">> $outputFolder.$file_name") or die $!; #error appears here
            print $OUTFILE @data;
            close $OUTFILE;

            }
            close $INFILE or die "Can't close input file";
        }
    }

【讨论】:

  • 其实"&gt;&gt; $outputFolder.$file_name" 解决了我的问题。谢谢!
  • 太棒了。尝试像我一样使用第一个 if,它会减少创建的循环数。这将有效地将 $file 与 PT_FCT_Sales*.out 匹配
  • 我会将其更改为 open(my $OUTFILE, '&gt;&gt;', "$outputFolder.$file_name") or die ...open() 的三参数版本本质上更安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多