При написании традиционной программы для 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 оболочкой?