将数组打印到文本文件(v2)

3
昨天我问了这个问题,并得到了很多有用的回答,希望今天也能如此。以下是我的修改后脚本。
#! /usr/bin/perl
use strict;
use warnings;

my $line;
my @array;
my $print;

open (OUT , ">","output.txt")or die "cant open: $!"; 
while ($line  = <>){
        chomp($line);
        push(@array, $line);
        if(@array == 250){
        $print = print "[", join(",",@array), "]", "\n";
        print OUT $print;
        @array = []
}
}

起初我只是说需要将一个由标准输入构建的数组的前250个元素输出到文本文件中,但我没有说明的是,用于构建数组的输入可能包含数千行。创建一个数组的原因是为了将数组大小限制为250个实体,然后将该数组作为格式化字符串打印出来。然后我需要清空数组,并从即将成为输入的第251行继续构建数组,并在剩余输入中继续执行此过程。假设输入有5k行,我希望我的输出是一个文本文件,其中包含原始的5k行输入,但被分为由250个数组实体组成的字符串。

目前的脚本只将数组打印到屏幕上,在“output.txt”中有一行文字:1111111

3个回答

4
$print = print "[", join(",",@array), "]", "\n";
print OUT $print;

在这里,你将print的返回值赋给了$print,因为打印成功了,所以它的值是1。你想要做的是:

print OUT "[", join(",",@array), "]", "\n";

4
@array = [] 是错误的,它创建了一个数组引用。正确的写法是 @array = () 或者 undef @array - Birei
是的,太好了。但是现在我的输出文件中出现了这样的行:'[ARRAY(0x936cd0),' - Ted Dorosheff
太好了,完美解决了。现在该怎么让它停止向屏幕输出全部信息呢?我只想让它输出到那个 .txt 文件中。 - Ted Dorosheff
请注释掉'$print = print'语句,以免输出到标准输出流。 - Davs
@TedDorosheff:这正是这个答案告诉你的。 - ysth

2
这里有另一种方法,稍微修改一下您的脚本即可:
use strict;
use warnings;

my @array;
local $" = ',';

while (<>) {
    chomp;
    push @array, $_;

    if ( @array == 250 ) {
        print "[@array]\n";
        undef @array;
    }
}

用法:perl script.pl Infile [>outFile]

最后一个可选参数将输出定向到文件。

变量$"保持Perl的列表分隔符,应用于插入的数组,因此这里不需要使用join

希望这有所帮助!


1
#! /usr/bin/perl
use strict;
use warnings;

my $line;
my @array;
my $print;

open (OUT , ">","moloch_chunker_output.txt")or die "cant open: $!";
while ($line  = <>){
        chomp($line);
        push(@array, $line);
        if(@array == 250){
        print OUT "[", join(",",@array), "]", "\n";
        @array = ();
}
}

谢谢davs,问题已解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接