2013-05-06 4 views
1

Я хочу запустить эту команду, но не из командной строки. Я хочу запустить файл, например first.pl, который выполняет некоторые другие команды. Например, когда я запускаю этот файл, я хочу это сделать:Как выполнить команду, сохраненную в файле в perl

perl -ne "print qq{$1\n} if /^\s+ (\w+)/x" file 

должно быть в этом файле. Я пробую что-то вроде этого:

my $input = "input.txt"; 
my @listOfFiles = `perl -ne "print qq{$1\n} if /^\s+ (\w+)/x" $input`; 
print @listOfFiles; 

но он ничего не печатает. Спасибо за ваши ответы.

+1

Почему вы запустите Perl как отдельно, вместо того, чтобы просто вводить код непосредственно в скрипт? – Barmar

+0

как я могу это сделать? –

ответ

2

Там нет необходимости запускать отдельную команду Perl, просто делать то, что вы хотите в главном скрипте:

open my $file, "input.txt"; 
my @listOfFiles; 
while (<$file>) { 
    if (/^\s+ (\w+)/x) { 
    push @listOfFiles, $1; 
    } 
} 
close $file; 
print "@listOfFiles"; 
3

Всегда используйте use strict; use warnings;! Вы получили бы

Unrecognized escape \s passed through 
Unrecognized escape \w passed through 
Use of uninitialized value $1 in concatenation (.) or string 

Как $1 является дополнением к желаемому $input. Поэтому вам нужно правильно избежать вашего аргумента. Предполагая, что вы не на системе Windows,

use strict; 
use warnings; 

use String::ShellQuote qw(shell_quote); 

my $input = "input.txt"; 
my $cmd = shell_quote('perl', '-ne', 'print "$1\n" if /^\s+ (\w+)/x', $input); 
chomp(my @listOfFiles = `$cmd`); 
print "$_\n" for @listOfFiles; 
+2

... или можно использовать 'open', что было бы фактически одним и тем же:' use autodie; откройте мои $ cmd, "- |", @command_with_args; chomp (my @listOfFiles = <$cmd>); close $ cmd; ' – amon

+0

@amon, В самом деле, спасибо. – ikegami

+0

У меня есть ошибка: 'Невозможно найти ограничитель строк" '"где-либо перед EOF на -e строке 1.' –

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