Читать файл в массив с помощью Perl - PullRequest
14 голосов
/ 10 мая 2011

Я сейчас читаю файл и храню данные в массиве с именем @lines.Затем я перебираю этот массив, используя цикл for, и внутри цикла, которому я сопоставляю, определенные значения:

$find = "fever";

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

В настоящее время я использую скаляр $find со значениемfever вместо выполнения повторяющихся операторов для каждого фильтра.

Могу ли я передать массив для сравнения вместо скалярного ключевого слова?

Ответы [ 4 ]

33 голосов
/ 10 мая 2011

Если вы прочитаете файл в список, он займет все сразу

@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>
5 голосов
/ 10 мая 2011

Использовать Tie :: File . Он загружает файл в массив, которым вы можете манипулировать, используя операции с массивами. Когда вы отвязываете файл, его компоненты будут сохранены обратно в файл.

5 голосов
/ 10 мая 2011

Если у вас есть Perl 5.10 или более поздняя версия, вы можете использовать интеллектуальное сопоставление (~~):

my @patterns = (qr/foo/, qr/bar/);

if ($line ~~ @patterns) {
    print "matched\n";  
}
4 голосов
/ 10 мая 2011

Вы также можете использовать модуль 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, взгляните на операторы map и grep, которые удобны для обработки списков.

Также обратите внимание на утилиту ack, которая является отличной заменой find / grep. (На самом деле, это превосходная альтернатива.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...