Поиск трубы и перенаправлений в perl @ARGV - PullRequest
3 голосов
/ 17 сентября 2011

При написании традиционной программы для Unix / Linux perl предоставляет оператор diamond <>.Я пытаюсь понять, как проверить, не передан ли вообще какой-либо аргумент, чтобы избежать сценария perl, сидящего в цикле ожидания для STDIN, когда он не должен этого делать.<> работает, но без аргументов мы ждем ввода STDIN, а это не то, что я хочу.

$ cat grab.pl | ./grab.pl
-: 7     print "$ARGV: $. $line" if ($line =~ /eof/) ;  # an example
-: 8     close(ARGV) if eof;

$ ./grab.pl < grab.pl
-: 7     print "$ARGV: $. $line" if ($line =~ /eof/) ;  # an example
-: 8     close(ARGV) if eof;

$ ./grab.pl grab.pl
grab.pl: 7     print "$ARGV: $. $line" if ($line =~ /eof/) ;  # an example
grab.pl: 8     close(ARGV) if eof;

$ ./grab.pl
^C
$ ./grab.pl
[Ctrl-D]
$

Первая мысль - проверить $ # ARGV, который содержит номер последнего аргумента в@ARGV.Затем я добавил тест в скрипт выше, перед циклом while, например, так:

if ( $#ARGV < 0 ) {   # initiated to -1 by perl
    usage();
}

Это не дало желаемых результатов.$ # ARGV равно -1 для перенаправления и канала в командной строке.При выполнении этой проверки (grabchk.pl) проблема изменилась, и я не могу прочитать содержимое файла с помощью <> в конвейере или в случаях перенаправления.

$ ./grabchk.pl grab.pl
grab.pl: 7     print "$ARGV: $. $line" if ($line =~ /eof/) ;
grab.pl: 8     close(ARGV) if eof;

$ ./grabchk.pl < grab.pl
    Usage:
        ./grabchk.pl file
        ./grabchk.pl < file
        cat file | ./grabchk.pl

$ cat grab.pl | ./grabchk.pl
    Usage:
        ./grabchk.pl file
        ./grabchk.pl < file
        cat file | ./grabchk.pl

Существует ли лучший тест для поиска всехпараметры командной строки, передаваемые в perl оболочкой?

Ответы [ 2 ]

5 голосов
/ 17 сентября 2011

Вы можете использовать оператор проверки файлов -t , чтобы проверить, открыт ли дескриптор файла STDIN для TTY.

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

if ( -t STDIN and not @ARGV ) {
    # print usage and exit
}
0 голосов
/ 17 сентября 2011

используйте оператор -t, чтобы проверить, подключен ли STDIN к tty, когда вы используете перенаправление канала или оболочки, он вернет false, поэтому вы используете

if ( -t STDIN and not @ARGV ){ exit Usage(); }
...