我有一个以这种方式格式化的文件:
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
出了什么问题?
提前感谢。
答案 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 strict
和use 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