Perl вложенные циклы - PullRequest
       25

Perl вложенные циклы

0 голосов
/ 21 марта 2012

У меня есть текстовый файл со следующим содержимым:

NW1 SN1 DEV1
NW2 SN1 DEV2

Я написал Perl-скрипт для итерации по файлу, но он запускается только один раз.Код:

open(INPUT1,"input.txt");
@input_array = <INPUT1>;

for($i=0;$i<@input_array;$i++)
{
    my ($ser,$node,@dev)=split(/ +/,$input_array[$i]);

    for($x=0;$x<@dev;$x++)
    {
        print("Hi");
    }
}

Сценарий повторяется для первой строки, но не повторяется для второй строки.

Ответы [ 2 ]

0 голосов
/ 17 августа 2013

Код, который вы разместили, может быть улучшен и приведен в соответствие с более современными стандартами.

  • Используется дескриптор файла голого слова 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;
    ...
}
0 голосов
/ 21 марта 2012

Вы забыли войти в режим хлебопечения оператора '<>'.Чтобы засосать полный файл, вы должны сделать это:

open(INPUT1,"input.txt");
undef $/;
@input_array = split(/\r?\n/, <INPUT1>);
close INPUT1;

или еще лучше, как это:

open(INPUT1,"input.txt");
while(<INPUT1>) {
  chomp;
  my ($ser,$node,@dev)=split(/ +/,$_);  

  for($x=0;$x<@dev;$x++) 
  {
    print("Hi");
  }
}
close INPUT1;
...