我想将代码的结果写入一个文件,但它没有写入我的文件。我的代码正在工作,它是关于删除重复的行,但是当我想把输出写入一个文件时,文件是空的。这是我的代码:
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;
显然只有你的路径