Почему-то если я использую ключ -n при запуске Perl, то он не понимает аргументы командной строки. Вот например (специально для тех, кто любит объяснять, что это все фигня и никому не нужно:
это чисто учебный пример имеющий чисто теоретическую ценность) захотелось мне реализовать поиск, я пишу скрипт:
# search.plx
use warnings;
use strict;
my $pattern = qr/$ARGV[0]/;
print if $_ =~ $pattern;
И вызываю его из консоли:
perl -n search.plx "a.b" < 1.txt
В ответ — ругань из серии
"a.b" file not found
Что-то не так с кодом? Или опция -n несовместима с ARGV?
Здравствуйте, Аноним, Вы писали:
А>Что-то не так с кодом? Или опция -n несовместима с ARGV?
Цитата из perlrun:
-n
causes Perl to assume the following loop around your program, which makes it iterate over filename arguments…
В данной ситуации параметры загоняются в @ARGV, но этот массив раскручивается, судя по всему, самим Перлом и обрабатывается как список файлов. Могу ошибаться, но мне кажется, что нормального решения нет. (Хотя извращенские придумать можно: скажем, сохранять содержимое @ARGV во временный файл, обнулять @ARGV, и читать данные из этого временного файла. Может, даже модуль какой в CPAN'е есть…)
Здравствуйте, Константин, Вы писали:
К> (Хотя извращенские придумать можно: скажем, сохранять содержимое @ARGV во временный файл, обнулять @ARGV, и читать данные из этого временного файла. Может, даже модуль какой в CPAN'е есть…)
Вот например как разбить файл на строки удовлетворяющие RE и не удовлетворяющие:
# mod1.pm
use warnings;
use strict;
our ($MATCHED, $NOT_MATCHED);
our $PATTERN = qr{PATTERN};
$MATCHED = $NOT_MATCHED = '';
sub process_line {
my $line = shift;
if ($line =~ m/$PATTERN/x ) {
$MATCHED .= $line
} else {
$NOT_MATCHED .= $line
};
}
END { print "match:\n${MATCHED}\nno match:\n${NOT_MATCHED}\n"; }
1;
а из командной строки мы вызываем его (например, чтобы обработать файл 1.txt) вот так:
$ perl -Mmod1 -wne "$::PATTERN=qr{[\\\/]}; process_line $_;" < 1.txt
Вот такой изврат позволяющий передать аргументы без @ARGV