在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