Почему вызов `system` со сторонним объектом дает синтаксическую ошибку только при autodie - PullRequest
2 голосов
/ 12 мая 2019

Функция Perl system разрешает косвенный объект.В этом случае косвенным объектом является запускаемая программа, позволяющая argv[0] отличаться от имени исполняемого файла.

Так что я могу сделать

system {"echo"} qw(echo foo);

Однако, когда яиспользуйте autodie:

use autodie qw(:all);
system {"echo"} qw(echo foo);

Я получаю

syntax error at - line 2, near "} qw(echo foo)"

Почему это происходит?

Ответы [ 2 ]

4 голосов
/ 12 мая 2019

Оператор system имеет три синтаксиса.

system LIST
system $SCALAR LIST
system BLOCK LIST

(Ни один из них не имеет ничего общего с косвенными вызовами методов или объектами вообще.)

autodie заменяет использование оператора system вызовами к сабвуферу с тем же именем.Подпрограммы могут предоставлять синтаксис system LIST и синтаксис system BLOCK LIST (с использованием прототипа), но не оба.

$ perl -e'
   CORE::say defined(prototype("CORE::system"))
       ? "Syntax can be emulated by subs."
       : "Syntax can\x27t be emulated by subs."
'
Syntax can't be emulated by subs.

Таким образом, менее часто используемый синтаксис system $SCALAR LIST и system BLOCK LIST недоступны, когда autodie заменяет system.Это задокументировано .

Применение autodie к system или exec вызывает экзотические формы <a href="http://perldoc.perl.org/functions/system.html" rel="nofollow noreferrer"><code>system {$ cmd} @ args или <a href="http://perldoc.perl.org/functions/exec.html" rel="nofollow noreferrer"><code>exec {$ cmd} @ args следует считать синтаксической ошибкой до конца лексической области.Если вам действительно нужно использовать экзотическую форму, вы можете вместо этого позвонить CORE::system или CORE::exec или использовать <a href="http://perldoc.perl.org/functions/system.html" rel="nofollow noreferrer">no</a> autodie qw(system exec) перед вызовом экзотической формы.

4 голосов
/ 12 мая 2019

Из документации autodie :

Применение autodie к system или exec приводит к тому, что экзотические формы system { $cmd } @args или exec { $cmd } @args считаются синтаксической ошибкой до конца лексической области. Если вам действительно нужно использовать экзотическую форму, вы можете вместо этого позвонить CORE::system или CORE::exec или использовать no autodie qw(system exec) перед вызовом экзотической формы.

То, что вы видите, это именно то, что задокументировано, и то, что произойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...