【问题标题】:Read a file into an array using Perl使用 Perl 将文件读入数组
【发布时间】:2011-08-22 08:17:24
【问题描述】:

我目前正在读取一个文件并将数据存储在一个名为@lines 的数组中。然后,我使用for 循环遍历这个数组,并在循环内匹配某些值:

$find = "fever";

if ($_ =~ /$find/) {
    print "$_\n";
    $number++;
    #@lines =
    #print ("there are : " . $number);
}

目前,我使用的是标量 $find,其值为 fever,而不是为每个过滤器执行重复语句。

我可以传递一个数组而不是一个标量关键字来进行比较吗?

【问题讨论】:

    标签: arrays perl file-io


    【解决方案1】:

    如果您将文件读入列表中,它将立即获取所有内容

    @array = <$fh>;  # Reads all lines into array
    

    将此与读入标量上下文进行对比

    $singleLine = <$fh>;  # Reads just one line
    

    一次读取整个文件可能是个问题,但你明白了。

    然后你可以使用grep 来过滤你的数组。

    @filteredArray = grep /fever/, @array;
    

    然后您可以使用scalar 获取过滤行的计数,这会强制标量(即单值)上下文对数组的解释,在本例中返回计数。

    print scalar @filteredArray;
    

    把它们放在一起......

    C:\temp>cat test.pl
    use strict; use warnings;  # always
    
    my @a=<DATA>;  # Read all lines from __DATA__
    
    my @f = grep /fever/, @a;  # Get just the fevered lines
    
    print "Filtered lines = ", scalar @f;  # Print how many filtered lines we got
    
    __DATA__
    abc
    fevered
    frier
    forever
    111fever111
    abc
    
    C:\temp>test.pl
    Filtered lines = 2
    C:\temp>
    

    【讨论】:

    • 如果它阐明了如何获取任意文件的文件句柄,这将是一个更好的答案,比如你在$filename 中有一个文件名。顺便说一下,DATA 对我来说是一个新人,但我从来都只是一个普通的 Perl 用户。
    【解决方案2】:

    如果你有 Perl 5.10 或更高版本,你可以使用智能匹配(~~):

    my @patterns = (qr/foo/, qr/bar/);
    
    if ($line ~~ @patterns) {
        print "matched\n";  
    }
    

    【讨论】:

      【解决方案3】:

      使用Tie::File。它将文件加载到一个数组中,您可以使用数组操作对其进行操作。当您解开文件时,其组件将被保存回文件中。

      【讨论】:

        【解决方案4】:

        你也可以使用File::Slurp模块,很方便。

        use strict;
        use warnings;
        use File::Slurp 'read_file';
        
        my $fname = shift or die 'filename!';
        my @lines = grep /fever/, read_file $fname; # grep with regular expression
        print @lines;
        

        如果您是 Perl 新手,请查看 mapgrep 运算符,它们可以方便地处理列表。

        另外,看看ack 实用程序,它可以很好地替代find/grep。 (实际上,它是一个更好的选择。)

        【讨论】:

          猜你喜欢
          • 2014-03-15
          • 2010-12-25
          • 1970-01-01
          • 2021-01-15
          • 2014-12-12
          • 2012-08-19
          • 1970-01-01
          • 2020-01-29
          相关资源
          最近更新 更多