while(<$fh>) {
Это читает файл построчно. Текущая строка файла сохраняется в $_
. Это в основном так же, как while($_ = <$fh>) {
. Технически он расширяется до while(defined($_ = <$fh>)) {
, но они очень близки к одному и тому же (и в любом случае, он автоматический, поэтому вам не нужно об этом беспокоиться).
@tmp = split;
"split
" без аргументов (в основном) эквивалентно "split /\s+/, $_
". Он разбивает текущую строку на список элементов между пробелами. Таким образом, он разбивает текущую строку на список слов (более или менее) и сохраняет этот список в массиве. Однако эта линия плохая. @tmp
должен быть квалифицирован как my
. Perl поймает это, если у вас есть use strict;
и use warnings;
наверху.
push @AoA, [@tmp];
}
Это помещает ссылку на анонимный массив, содержащий элементы, которые были в @tmp
, в @AoA
, который представляет собой массив массивов (как вы, вероятно, уже знали).
Итак, в конце концов, у вас есть список @AoA
, где каждый элемент в списке соответствует строке файла, а каждый элемент списка - это другой список слов в этой строке.
Короче говоря, @tmp
должно действительно быть объявлено с использованием my
, и вы должны use strict;
и use warnings;
. На самом деле, как уже было сказано, вы можете покончить с @tmp
в целом:
while(<$fh>) { push @AoA, [split] }
Но использование временного массива может быть лучше для тех, кому нужно добавить этот код позже.
РЕДАКТИРОВАТЬ: я пропустил регулярное выражение, которое вы хотели добавить:
while(<$fh>) {
last unless /^[\d\s]*$/;
push @AoA, [split];
}
Однако, /^[\d\s]*$/
не поймает все целые числа - в частности, оно не будет соответствовать -1
. Если вы хотите, чтобы оно совпадало с отрицательными числами, используйте /^[\d\s-]*$/
. Кроме того, если вы хотите сопоставить нецелые числа (числа с плавающей точкой), вы можете использовать /^[\d\s\.-]*$/
, но я не знаю, хотите ли вы сопоставить их. Однако эти регулярные выражения будут совпадать с недопустимыми записями, такими как 1-3
и 5.5.5
, которые НЕ являются целыми числами или числами. Если вы хотите быть более строгим, попробуйте следующее:
LOOP: while(<$fh>) {
my @tmp = split;
for(@tmp) {
# this line for floating points:
last LOOP unless /^-?\d+(?:\.\d+|)$/;
# this line for just integers:
last LOOP unless /^-?\d+$/;
}
push @AoA, [@tmp];
}