【问题标题】:How to get the data of each line from a file?如何从文件中获取每一行的数据?
【发布时间】:2016-10-05 04:01:20
【问题描述】:

在这里,我想将每行中的数据打印为 3 个单独的值,并以“:”作为分隔符。文件BatmanFile.txt 有以下详细信息:

Bruce:Batman:bat@bat.com
Santosh:Bhaskar:santosh@santosh.com

我预期的输出是:

Bruce
Batman
bat@bat.com
Santosh
Bhaskar
santosh@santosh.com

执行脚本后的输出为:

Bruce
Batman
bat@bat.com
Bruce
Batman
bat@bat.com

请解释一下我在这里缺少什么:

use strict;
use warnings;

my $file = 'BatmanFile.txt';
open my $info, $file or die "Could not open $file: $!";
my @resultarray;
while( my $line = <$info>)  {   
    #print $line;    
    chomp $line;
    my @linearray = split(":", $line);
    push(@resultarray, @linearray);
    print join("\n",$resultarray[0]),"\n";
    print join("\n",$resultarray[1]),"\n";
    print join("\n",$resultarray[2]),"\n";
}
close $info;

【问题讨论】:

    标签: arrays perl


    【解决方案1】:

    您正在逐行循环文件。您已将所有行(拆分后)存储在一个数组中。循环完成后,您将拥有 resultarray 数组中的所有数据,只需在循环后打印整个数组(而不是仅打印您目前正在执行的前 3 个索引)。

    #!/usr/bin/perl
    use strict;
    use warnings;
    my @resultarray;
    while( my $line = <DATA>){
        chomp $line;
        my @linearray = split(":", $line);
        push @resultarray, @linearray;
    }
    print "$_\n" foreach @resultarray;
    __DATA__
    Bruce:Batman:bat@bat.com
    Santosh:Bhaskar:santosh@santosh.com
    

    Demo


    您可以避免所有变量并执行以下操作

    while(<DATA>){
        chomp;
        print "$_\n" foreach split(":");
    }
    

    一个班轮:

    perl -e 'while(<>){chomp; push @result, split(":",$_);} print "$_\n" foreach @result' testdata.txt
    

    【讨论】:

    • 谢谢 Chankey。
    • 不客气。顺便说一句,您可以轻松避免所有数组操作。请参阅编辑后的答案(第 2 部分)。
    • 感谢您对此的简要解释,并为我提供了获取输出的最佳方法。但是,我需要这些变量来完成其他任务,所以我接受了另一个答案。非常感谢您分享这些技巧。
    • 哦,如果您需要它们,那么它不适用 :)
    【解决方案2】:

    当你这样做时:

    push(@resultarray, @linearray);
    

    你最后将@linearray推入@resultarray,所以索引02仍然是你第一次推@linearray时的项目。

    要用第二次迭代的值覆盖@resultarray,请执行以下操作:

    @resultarray = @linearray;
    

    改为。

    或者,使用unshift@linearray 放在@resultarrayas suggested by Sobrique 的开头:

    unshift @resultarray, @linearray;
    

    【讨论】:

    • 或者我们unshift把它放在开头。
    • 谢谢@Sobrique 和 Mathias。
    【解决方案3】:

    所以,您只想将transliterate : 转为\n

    $ perl -pe 'tr/:/\n/' data.txt
    

    输出:

    Bruce
    Batman
    bat@bat.com
    Santosh
    Bhaskar
    santosh@santosh.com
    

    【讨论】:

      【解决方案4】:
      use strict;
      use warnings;
      
      my $file = 'BatmanFile.txt';
      open my $info, $file or die "Could not open $file: $!";
      my @resultarray;
      while( my $line = <$info>)  {   
      
          #print $line;    
          chomp $line;
          my @linearray = split(":", $line);
          #push(@resultarray, @linearray);
          print join("\n",$linearray[0]),"\n";
          print join("\n",$linearray[1]),"\n";
          print join("\n",$linearray[2]),"\n";
      
      }
      close $info;
      

      【讨论】:

      • 欢迎来到Stack Overflow!不鼓励仅使用代码的答案;一些解释会有所帮助。 (有关更多信息,请参阅 How to Answer。)关于代码本身,加入 1 项列表不会给您带来非常有趣的结果。
      猜你喜欢
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 2018-01-11
      • 2021-06-17
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多