Код, который вы разместили, может быть улучшен и приведен в соответствие с более современными стандартами.
- Используется дескриптор файла голого слова
INPUT1
.
- Не используется 3-arg
open
.
- Не используются строгие или предупреждения ( см. Этот вопрос ).
- Не проверяется возвращаемое значение
open
или close
. (Вот для чего нужна строка autodie в следующем коде)
- Он использует стиль C для циклов , когда это не нужно.
- Он загружает весь файл в память, хотя он обрабатывает файл только по одной строке за раз.
use strict;
use warnings;
use autodie; # checks return value of open and close for us
# 3 arg open
open( my $in_fh, '<', 'input.txt' );
# don't read the file into memory until needed
while( <$in_fh> ){
# using $_ simplified this line
my ($ser,$node,@dev) = split;
# no need to track the indices just loop over the array
for my $dev (@dev){
print "Hi\n";
}
}
close $in_fh;
Если по какой-то причине вам действительно нужны индексы массива @dev
, лучше написать это так:
for my $x ( 0..$#dev ){
...
}
Если вы хотите явно сохранить строку в переменной с другим именем, вы бы изменили цикл while
на этот:
while( my $line = <$in_fh> ){
my ($ser,$node,@dev) = split / +/ $line;
...
}