2016-04-27 6 views
3
open my $directory, '<', abc.txt 

chomp(my @values = <$directory>); 

Существует файл с именем abc.txt со следующим содержанием:Как выполнить команду для каждой строки в файле?

abcde 
abc 
bckl 
drfg 
efgt 
eghui 
webnmferg 

С выше линии, я посылаю содержимое файла abc.txt в массив

Намерение является создание цикла для запуска команда на всех строках файла abc.txt

Любые предложения по созданию цикла?

+3

Почему переменная, содержащая дескриптор файла, называемый '$ directory'? Это довольно неоднозначно в контексте ИТ. Используйте значащие имена для ваших переменных! – simbabque

ответ

3
open my $directory_fh, '<', abc.txt or die "Error $! opening abc.txt"; 
while (<$directory_fh>) { 
    chomp; # Remove final \n if any 
    print $_; # Do whatevery you want here 
} 
close $directory_fh; 

Я предпочитаю суффикс все дескрипторы файлов с _fh, чтобы сделать их более очевидными.

while (<fh>) петли, хотя все строки файла.

Возможно, вам понадобится/хотите удалить окончательный \r, если файл может иметь формат Windows/MS-DOS.

+3

Фактически 'chomp' удаляет все, что находится в' $/'. – simbabque

1

создать цикл, чтобы выполнить команду на всех строках файла abc.txt

foreach my $line (@lines){ 
     #assugming $cmd contains the command you want to execute 
     my $output = `$cmd $line`; 
     print "Executed $cmd on $line, output: $output\n"; 
} 

Edit: В соответствии с обратной связью Себастьяна

my $i = 0; 
while ($i <= $#lines){ 
     my $output = `$cmd $lines[$i]`; 
     print "Executed $cmd on $lines[$i], output: $output\n"; 
} 

или, если вы хорошо с разрушающий массив:

while (@lines){ 
     my $line = shift @lines; 
     my $output = `$cmd $line`; 
     print "Executed $cmd on $line, output: $output\n"; 
} 

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

while (my ($line) = splice(@array, 0, 1)) { 
     my $output = `$cmd $line`; 
     print "Executed $cmd on $line, output: $output\n"; 
} 
+0

Решение 'for' загружает все содержимое файла в память, которое может стать очень большим,' while' загружает только одну строку (в блоках размера буфера Perl). – Sebastian

+0

Правильно. Я обновил ответ в соответствии с вашим вводом. Благодарю. –

Смежные вопросы