Я видел оба варианта:
say STDERR 'hello world';
say {*STDERR} 'hello world';
Есть разница? Соображения безопасности, передовой опыт, ...?
Я видел оба варианта:
say STDERR 'hello world';
say {*STDERR} 'hello world';
Есть разница? Соображения безопасности, передовой опыт, ...?
Я бы сказал, что первый вариант - это идиоматический способ выразить это, и я не думаю, что когда-либо видел второй вариант для простых дескрипторов файлов.
Второй вариант — это простой пример более общей конструкции, в которой вы можете динамически определять дескриптор файла. Например, было бы полезно написать что-то вроде кода:
say { $errors_on_stderr ? *STDERR : *STDOUT } "hello world";
Где переменная используется, чтобы решить, какой дескриптор файла следует использовать. Внутри фигурных скобок можно использовать любое выражение Perl. Другим примером может быть, если у вас есть дескриптор файла, хранящийся в хэше. Тогда может быть необходимо написать
my $data = { fh => *STDOUT };
say { $data->{fh} } "Hello world";
Но в вашем простом случае я бы за первый вариант.
$ perlcritic -1 script.pl
. Использование варианта в фигурных скобках считается передовой практикой, но только потому, что он визуально отличает дескриптор файла от других аргументов. Этот PBP определяется здесь< /а> 11.03.2016print {$output}, "some text";
является синтаксической ошибкой, гдеprint $output, "some text";
нет, но не делает то, что вы хотели. (В дополнение к пункту ясности). Ни одна из ИМО не применима кSTDOUT
/STDERR
. 11.03.2016