在perl文件中拆分行不起作用

时间:2014-11-03 17:43:19

标签: perl

我有一个以这种方式格式化的文件:

string:string1
string2:string3
....

我想扫描每一行并按:

分割字符串
#!/usr/bin/perl

open(FILE,$ARGV[0]) or die "can't find file";
foreach (<FILE>){
       @array = split(":");
}
foreach $string (@array){
        print "$string";
}
exit 0;

但我只输出文件的最后一行未分割,例如stringN:stringM

出了什么问题?

提前感谢。

4 个答案:

答案 0 :(得分:2)

您正在重新分配@array文件的每一行。 Clobbering其中的任何内容。所以它只会持有最后一行的内容。

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


#open(FILE,$ARGV[0]) or die "can't find file";

foreach (<DATA>) {
    chomp; #remove trailing linefeed
    my @array = split(":");

    foreach my $string (@array) {
        print " -> ", $string, "\n";
    }
    print "End of line\n";
}

__DATA__
string1:string4
string2:string5:string232

答案 1 :(得分:2)

您应该总是 use strictuse warnings位于您编写的每个 Perl程序的顶部,并使用{{1声明所有变量}}

因为您尚未声明它,所以您正在使用全局数组my,每次分配时都会覆盖它,因此只剩下文件最后一行的字段。

无需显式打开名称作为参数传递的文件。如果您只是使用@array读取空文件句柄,那么Perl将自动打开并从这些文件中读取。

您还需要从您阅读的每一行的末尾<>换行,否则每行的最后一个字段将以换行符结尾。

看起来您只需要文件所有行中所有字段的单个列表。这将为您做到这一点。它使用chomp 每个新字段添加到数组push,而不是覆盖已存在的字段。

@list

答案 2 :(得分:1)

你到达代码,我只是修改你的代码试试吧

my @data;
foreach (<DATA>){
       @array = split(":",$_); 
       push(@data,@array);
}
foreach $string (@data){
       print "$string\n";
}

__DATA__
string1:string4
string2:string5:string232

这是输出。

在您的代码中,您为其他@array循环调用foreach。哪个只打印你得到的最后一行。所以在这里我使用push函数将所有数据存储到新数组@data中,然后在其他循环条件下打印分裂的单词。此外,您还没有使用$_来分割第一个foreach循环中的数据。

答案 3 :(得分:0)

您也可以使用以下perl one liner:

在Windows提示符下

perl -ne "if(@list = split(\":\",$_)) { foreach(@list) { chomp;print \"$_\n\";}}" InputFile

在Unix上:

perl -ne 'if(@list = split(":",$_)) { foreach(@list) { chomp;print "$_\n";}}' InputFile