Ваше "если данные передаются по каналу" усложняет ситуацию.Легко сказать
if (!@ARGV) {
@ARGV = ("somedefault");
}
while (<>) {
...
}
, который будет работать на "somedefault", если в командной строке не указаны имена файлов, но это означает, что вы никогда не получите Perl по умолчанию для чтения из stdin, если их нетимена файлов в командной строке.
Одним из возможных компромиссов является использование оператора -t , чтобы угадать, является ли stdin терминалом:
if (!@ARGV && -t STDIN) {
@ARGV = ("somedefault");
}
, который будет использовать "somedefault"если в командной строке нет имен файлов и stdin подключен к терминалу, но он будет использовать stdin, если имен файлов нет, а stdin перенаправляется из файла или канала.Это немного волшебно (может быть досадно), но делает то, что вы просили.