我想将我的代码结果写入文件,但它没有写入我的文件中。我的代码正在运行,它是关于删除重复行,但是当我想将输出写入文件时,该文件为空。这是我的代码:
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;
答案 0 :(得分:1)
这可以按预期工作
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参数open,lexical文件句柄和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 );
答案 1 :(得分:1)
您的主要问题可能是$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参数打开。
答案 2 :(得分:0)
不太确定你在common_element.txt中想要什么,但我认为读取循环中的逻辑是错误的。无需增加$行两次,只有在现有数据匹配时才输出?
尝试:
/User/Search?Item=MyApplication.Model.User&PageSize=2&PageNumber=2
显然只有您的路径。