无法将输出写入perl中的文件

时间:2016-06-25 11:08:11

标签: perl file url-rewriting

我想将我的代码结果写入文件,但它没有写入我的文件中。我的代码正在运行,它是关于删除重复行,但是当我想将输出写入文件时,该文件为空。这是我的代码:

 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;

3 个答案:

答案 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  

显然只有您的路径。