Подтвердить что ты не робот

Почему я должен указывать оператор использования при использовании функции say?

Этот вопрос может быть глупым. Но я только начал изучать Perl. Я использую Perl v5.16.2. Я знаю, что оператор say был введен в 5.10.

#!/usr/bin/perl

say "Hello World!";

Когда я пытаюсь запустить программу выше, я получаю следующую ошибку:

$ ./helloPerl 
String found where operator expected at ./helloPerl line 3, near "say "Hello World!""
    (Do you need to predeclare say?)
syntax error at ./helloPerl line 3, near "say "Hello World!""
Execution of ./helloPerl aborted due to compilation errors.

Но когда я добавил оператор use 5.016;, он дает мне правильный вывод.

#!/usr/bin/perl

use 5.016;
say "Hello World!";

Мое сомнение в том, что я использую perl v5.16.2, который выше 5.010. Почему я должен упоминать версию Perl с помощью инструкции use здесь?

4b9b3361

Ответ 1

Функции, которые могут нарушить обратную совместимость, по умолчанию не включены.

Смотрите perldoc feature:

Обычно невозможно добавить новый синтаксис в Perl, не нарушая некоторые существующие программы. Эта прагма обеспечивает способ минимизации этого риска. Новые синтаксические конструкции или новые семантические значения для старых конструкций могут быть включены с помощью функции foo и будут анализироваться только тогда, когда соответствующая функция прагма находится в области видимости. (Тем не менее, префикс CORE:: обеспечивает доступ ко всем ключевым словам Perl, независимо от этой прагмы.)

use на номере версии, неявно включает все функции, поскольку также применяется ограничение на версию perl. Например, вы не будете опрокидываться, например, say.

Ответ 2

say является функцией, он не является (еще когда-нибудь) регулярным синтаксисом perl.

Используйте

use feature qw(say);

или

use v5.010; # or any version later