在perl中拆分文件中的行不起作用
我有一个文件的格式如下:在perl中拆分文件中的行不起作用,perl,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; #/usr/bin/
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;
#/usr/bin/perl
打开(文件$ARGV[0])或死“找不到文件”;
foreach(){
@数组=拆分(“:”);
}
foreach$string(@array){
打印“$string”;
}
出口0;
但我只在输出中得到未拆分文件的最后一行,例如stringN:stringM
怎么了
提前感谢。您正在重新分配
@array
文件的每一行。痛击里面的东西。所以它只能保存最后一行的内容
#!/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
#/usr/bin/perl
严格使用;
使用警告;
#打开(文件$ARGV[0])或死“找不到文件”;
foreach(){
chomp;#移除尾部换料
my@array=split(“:”);
foreach my$string(@array){
打印“->”,$string,“\n”;
}
打印“行尾\n”;
}
__资料__
第1条:第4条
string2:string5:string232
您正在重新分配@array
文件的每一行。痛击里面的东西。所以它只能保存最后一行的内容
#!/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
#/usr/bin/perl
严格使用;
使用警告;
#打开(文件$ARGV[0])或死“找不到文件”;
foreach(){
chomp;#移除尾部换料
my@array=split(“:”);
foreach my$string(@array){
打印“->”,$string,“\n”;
}
打印“行尾\n”;
}
__资料__
第1条:第4条
string2:string5:string232
您应该在编写的每个Perl程序的顶部始终使用strict
和使用warnings
,并使用my
声明所有变量
因为您没有声明它,所以您使用的是一个全局数组@array
,它在每次分配给它时都会被覆盖,因此它只保留文件最后一行的字段
不需要显式打开名称作为参数传递的文件。如果您只是使用
读取空文件句柄,那么Perl将为您自动打开并读取这些文件
您还需要chomp
从您读取的每一行末尾开始选择换行符,否则每一行的最后一个字段将以换行符结尾
看起来您只需要文件所有行中所有字段的单个列表。这会帮你的。它使用push
将每一组新字段添加到数组@list
中,而不是覆盖已经存在的字段
use strict;
use warnings;
my @list;
while (<>) {
chomp;
push @list, split /:/;
}
print "$_\n" for @list;
使用严格;
使用警告;
我的@list;
而(){
咀嚼;
推送@list,拆分/:/;
}
为@list打印“$\un”;
您应该在编写的每个Perl程序的顶部始终使用strict
和使用warnings
,并使用my
声明所有变量
因为您没有声明它,所以您使用的是一个全局数组@array
,它在每次分配给它时都会被覆盖,因此它只保留文件最后一行的字段
不需要显式打开名称作为参数传递的文件。如果您只是使用
读取空文件句柄,那么Perl将为您自动打开并读取这些文件
您还需要chomp
从您读取的每一行末尾开始选择换行符,否则每一行的最后一个字段将以换行符结尾
看起来您只需要文件所有行中所有字段的单个列表。这会帮你的。它使用push
将每一组新字段添加到数组@list
中,而不是覆盖已经存在的字段
use strict;
use warnings;
my @list;
while (<>) {
chomp;
push @list, split /:/;
}
print "$_\n" for @list;
使用严格;
使用警告;
我的@list;
而(){
咀嚼;
推送@list,拆分/:/;
}
为@list打印“$\un”;
您还可以使用以下perl一行程序:
在windows提示下:
perl -ne "if(@list = split(\":\",$_)) { foreach(@list) { chomp;print \"$_\n\";}}" InputFile
perl -ne 'if(@list = split(":",$_)) { foreach(@list) { chomp;print "$_\n";}}' InputFile
在Unix上:
perl -ne "if(@list = split(\":\",$_)) { foreach(@list) { chomp;print \"$_\n\";}}" InputFile
perl -ne 'if(@list = split(":",$_)) { foreach(@list) { chomp;print "$_\n";}}' InputFile
您还可以使用以下perl一行程序: 在windows提示下:
perl -ne "if(@list = split(\":\",$_)) { foreach(@list) { chomp;print \"$_\n\";}}" InputFile
perl -ne 'if(@list = split(":",$_)) { foreach(@list) { chomp;print "$_\n";}}' InputFile
在Unix上:
perl -ne "if(@list = split(\":\",$_)) { foreach(@list) { chomp;print \"$_\n\";}}" InputFile
perl -ne 'if(@list = split(":",$_)) { foreach(@list) { chomp;print "$_\n";}}' InputFile
你达到代码,我只是修改了你的代码试试吧
my @data;
foreach (<DATA>){
@array = split(":",$_);
push(@data,@array);
}
foreach $string (@data){
print "$string\n";
}
__DATA__
string1:string4
string2:string5:string232
my@数据;
foreach(){
@数组=拆分(“:”,$);
推送(@data,@array);
}
foreach$string(@data){
打印“$string\n”;
}
__资料__
第1条:第4条
string2:string5:string232
这是给输出的
在您的代码中,为其他
foreach
循环调用@array
。这只是打印你最后一行。因此,这里我使用了push
函数将所有数据存储到新数组@data
中,然后在其他循环条件下打印拆分的字。而且,在第一个foreach
循环中,您不必使用$\ucode>分割数据。如果您达到了代码,我只是修改了您的代码,请尝试
my @data;
foreach (<DATA>){
@array = split(":",$_);
push(@data,@array);
}
foreach $string (@data){
print "$string\n";
}
__DATA__
string1:string4
string2:string5:string232
my@数据;
foreach(){
@数组=拆分(“:”,$);
推送(@data,@array);
}
foreach$string(@data){
打印“$string\n”;
}
__资料__
第1条:第4条
string2:string5:string232
这是给输出的
在您的代码中,为其他foreach
循环调用@array
。这只是打印你最后一行。因此,这里我使用了push
函数将所有数据存储到新数组@data
中,然后在其他循环条件下打印拆分的字。而且,在第一个foreach
循环中,您也不会使用$\ucode>分割数据。我必须在foreach外部初始化数组?如果需要,您可以这样做,但这仍然没有帮助。Split返回一个数组。您正在用split
给您的任何内容替换@array的内容。所以,除了最后一行,你在做任何事情之前都要替换它;除了最后一行,你什么都看不到。我必须在foreach外部初始化数组?如果你愿意,你可以,但这仍然没有帮助。Split返回一个数组。您正在用split
给您的任何内容替换@array的内容。所以除了最后一行之外,每一行都替换b