使用Perl将文件读入数组

15

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

$find = "fever";

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

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

我能否传递一个数组来进行比较,而不是使用标量关键字?

4个回答

33

如果将文件读入列表中,它会一次性读取所有内容。

@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>

3
如果能够解释如何获取任意文件的文件句柄,比如当你有一个$filename变量存储了文件名时,这个回答会更好。顺便说一句,对我来说__DATA__还很新奇,但我只是一个偶尔使用Perl的用户。 - 15ee8f99-57ff-4f92-890c-b56153

5
如果您使用的是Perl 5.10或更高版本,您可以使用智能匹配(~~):
my @patterns = (qr/foo/, qr/bar/);

if ($line ~~ @patterns) {
    print "matched\n";  
}

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

5

您还可以使用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的一个很好的替代品。(实际上,它是更优秀的选择。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接