无法用perl将输出写入文件



我想将代码的结果写入一个文件,但它没有写入我的文件。我的代码正在工作,它是关于删除重复的行,但是当我想把输出写入一个文件时,文件是空的。这是我的代码:

 use strict;
    use warnings;
    open(DATA,"/root/Desktop/SIEMENS/printtokens/outputs/common_distinct/MR1/thiscommon.txt");
    open FILE2, ">/root/Desktop/SIEMENS/printtokens/outputs/common_distinct/MR1/common_element.txt" or die $!;
    my %lines;
    #open DATA, $ARGV[0] or die "Couldn't open $ARGV[0]: $!n";
    while (<DATA>) {
    print if not $lines{$_}++;
    print FILE2 if not $lines{$_}++;
    }
    close DATA;
    close FILE2;

正常运行

use strict;
use warnings;
use autodie;
open(my $in, '<', './in.txt');
open(my $out, '>', './out.txt');
my %lines;
while (<$in>) {
    print $out $_ unless $lines{$_}++;
}
close $in;
close $out;

注意3参数打开、词法文件句柄和autodie pragma的用法。

作为一个CPAN模块使用的粉丝,我将会这样写:

use 5.014;
use warnings;
use Path::Tiny;
use List::Util qw(uniq);
my $out_file = './out.txt';
my $in_file = './in.txt';
path($out_file)->spew( uniq path($in_file)->lines );

您的主要问题可能是$lines{$_}++改变了$lines{$_}的值,因此第二个将永远不会计算为false。您可以通过在第一次出现时删除++来解决问题。但是为了可读性,我建议用一个if语句包装两个输出行,避免使用$_并记得关闭文件,所以像这样:

use strict;
use warnings;
my %lines;
open(my $in, '<', './in.txt');
open(my $out, '>', './out.txt');
while (my $line = <$in>) {
    unless ($lines{$line}++) {
        print STDOUT $line;
        print {$out} $line
    }
}
close($in);
close($out);

如您所见,我也更喜欢词法文件句柄和3参数open.

不太确定您想要common_element.txt中的内容,但我认为读循环中的逻辑是错误的。不需要增加$lines两次,只在现有数据中有匹配时输出?

试题:

use strict;
use warnings;
open(DATA,"thiscommon.txt");
open (FILE2, '>common_element.txt') or die $!;
my %lines;
while (<DATA>) {
  print FILE2 if $lines{$_};
  print if not $lines{$_}++;
}
close DATA;
close FILE2;        

显然只有你的路径

相关内容

  • 没有找到相关文章

最新更新