Perl стандартный ввод с аргументом внутри Bash - PullRequest
2 голосов
/ 12 апреля 2010

Я хочу, чтобы такая труба была в bash

#! /usr/bin/bash
cut -f1,2 file1.txt | myperl.pl foo | sort -u 

Сейчас в myperl.pl у этого есть содержание как это

my $argv = $ARG[0] || "foo";

while (<>) {
 chomp;
 if ($argv eq "foo") {
  # do something with $_
 }
 else {
   # do another
 }
}

Но почему скрипт Perl не может распознать параметр, переданный через bash? А именно код разрыва с этим сообщением:

Can't open foo: No such file or directory at myperl.pl line 15.

Какой правильный способ сделать это, чтобы мой Perl-скрипт мог получать стандартный ввод и параметр в то же время?

Ответы [ 3 ]

6 голосов
/ 12 апреля 2010

<> является особенным: он возвращает строки либо из стандартного ввода, либо из каждого файла, указанного в командной строке. Поэтому аргументы из командной строки интерпретируются как имена файлов, которые нужно открывать и возвращать строки из. Следовательно сообщение об ошибке, что он не может открыть файл foo.

В вашем случае вы знаете, что хотите прочитать данные из <stdin>, поэтому просто используйте это вместо <>:

while(<stdin>)

Если вы хотите сохранить функциональность необязательного указания входных файлов в командной строке, вам необходимо удалить аргумент foo из @ARGV перед использованием <>:

my $firstarg = shift(@ARGV);
...
while (<>) {
    ...
    if ($firstarg eq "foo") ...
1 голос
/ 20 апреля 2012

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

Это не удается :

cat file | perl -ne '$myarg=shift; if ($myarg eq "foo") {} else {}' foo #WRONG

говоря Can't open foo: No such file or directory.

Но это работает :

cat file | perl -ne 'BEGIN {$myarg=shift}; if ($myarg eq "foo") {} else {}' foo
0 голосов
/ 12 апреля 2010

Попробуйте:

foo=`cut -f1,2 file1.txt`
myperl.pl $foo | sort -u

Я предполагаю, что вы пытаетесь передать вывод команды cut в качестве аргумента "foo" в скрипт myperl.pl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...