2016-03-11 3 views
0

Я видел оба варианта:Печать на STDERR или {* STDERR}?

say STDERR 'hello world'; 

say {*STDERR} 'hello world'; 

Любая разница? Вопросы безопасности, передовая практика, ...?

+0

Одно слово «быстродействующим»: короткие и на первый взгляд простые вопросы могут стать интересными, если вы потратите время, чтобы действительно понять весь фон. См. Мой комментарий к принятому ответу ниже. – lanti

ответ

2

Я бы сказал, что первый вариант - это идиоматический способ выразить это, и я не думаю, что когда-либо видел второй вариант для простых файловых дескрипторов.

Второй вариант - это простой пример более общей конструкции, в которой вы можете динамически управлять файловой обработкой. Например, может быть полезно написать код примерно так:

say { $errors_on_stderr ? *STDERR : *STDOUT } "hello world"; 

Где переменная используется для определения того, какой дескриптор файла должен использоваться. Вы можете использовать любое выражение perl внутри фигурных скобок. Другим примером может быть, если у вас есть дескриптор файла, хранящийся в хеше. Тогда может понадобиться написать

my $data = { fh => *STDOUT }; 
say { $data->{fh} } "Hello world"; 

Но в вашем простом случае я бы выбрал первый вариант.

+0

Спасибо @pmakholm за то, что вы делитесь своей точкой зрения и примерами. Наконец, я нашел причину для того, чтобы увидеть оба варианта, когда я запускаю '$ perlcritic -1 script.pl'. Использование ** комбинированного варианта ** считается лучшей практикой, но только потому, что визуально отличает дескриптор файла от других аргументов. Этот PBP определен [здесь] (http://search.cpan.org/dist/Perl-Critic-1.116/lib/Perl/Critic/Policy/InputOutput/RequireBracedFileHandleWithPrint.pm) – lanti

+0

Теперь вы упоминаете его, я его узнаю как нечто PBP порекомендовал бы - Не то, чтобы я согласился, и Perl :: Критик, похоже, имеет его с наименьшей серьезностью. – pmakholm

+2

Причина, по которой рекомендуется использовать лексические дескрипторы файлов: 'print {$ output}," some text ";' - синтаксическая ошибка, где 'print $ output, 'some text';' is not, но не делает то, что Вы хотели. (В дополнение к точке четкости). Ни один из которых ИМО действительно не относится к 'STDOUT' /' STDERR'. – Sobrique

Смежные вопросы