perl -n vs @ARGV
От: Аноним  
Дата: 25.02.09 14:29
Оценка:
Почему-то если я использую ключ -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?
Re: perl -n vs @ARGV
От: Константин Россия http://flint-inc.ru/
Дата: 25.02.09 16:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Что-то не так с кодом? Или опция -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'е есть…)
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re: perl -n vs @ARGV
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 26.02.09 06:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Почему-то если я использую ключ -n при запуске Perl, то он не понимает аргументы командной строки.


Потому что он их понимает как список файлов на обработку (кажется, это Вам уже ответили). Я думаю, что без -n и с явным <> будет тот же эффект:) проверять облом.
The God is real, unless declared integer.
Re[2]: perl -n vs @ARGV
От: Аноним  
Дата: 26.02.09 14:30
Оценка:
Здравствуйте, Константин, Вы писали:

К> (Хотя извращенские придумать можно: скажем, сохранять содержимое @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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.