Почему "использование" не допускается, как в "use strict"; в Perl 5.14?

Я пытаюсь использовать следующие соглашения. Мне было поручено использовать для хорошего/правильного/безопасного кода Perl для моей программы "Hello, World!":

use strict;
use warnings;

Я создал и успешно выполнил следующую программу "Hello World", используя (Strawberry) Perl 5.12 на моей основной ОС Windows 7:

!#/usr/bin/perl
use strict;
use warnings;

print "Hello, World!\n";

То, что я получил, как и ожидалось, было "Hello, World!".

Меня поразило то, что одна и та же программа, запущенная в терминале на моей виртуализированной ОС Linux Mint 14 с использованием Perl 5.14, вызвала следующую ошибку:

"use" not allowed in expression at /PATH/hello_world.pl line 2, at end of line
syntax error at /PATH/hello_world.pl line 2, near "use strict"
BEGIN not safe after errors--compilation aborted at /PATH/hello_world.pl line 3.

Впоследствии я создал другие программы Hello World без строк use strict; или use warnings;, а также один с -w, который я видел в некоторых учебниках, что указывает, если я не ошибаюсь, что предупреждения будут включены.

Обе мои альтернативные версии работали правильно, потому что они дали ожидаемый результат:

Hello, World!

Я не могу быть уверен в том, что мне нужны инструкции use в Perl-программах из версии 5.14 и выше, или если это нормально писать -w в конце моей первой строки.

Мне хотелось бы думать, что я могу использовать согласованный заголовок, так сказать, во всех своих программах Perl, будь то Windows или Linux, Perl 5.12 или 5.14 или иначе.

Ответ 1

Ваше изображение показывает, что все ваши скрипты начинаются с !#/usr/bin/perl. Это не верно. Это не действительная строка she-bang, она читается как отрицание !, за которой следует комментарий #. Разбор продолжится, и script1.pl perl выполнит ! print "Hello world.\n";. Это напечатает Hello world и отрицает результат print... не очень полезный, но действительный perl.

В script2.pl perl видит ! use strict;, и это ошибка времени компиляции, и поэтому perl сбой и сообщает об ошибке для строки use strict;.

Итак, если вы используете правильные строки, все три сценария будут работать как разработанные.

Изменить (добавлены тестовые скрипты):

script1.pl

!#/usr/bin/perl

print "Hello world.\n" ;

Вызов perl script1.pl дает

Hello world.

script2.pl

!#/usr/bin/perl

use strict;
use warnings ;

print "Hello world.\n" ;

Вызов perl script2.pl дает

"use" not allowed in expression at script2.pl line 3, at end of line
syntax error at script2.pl line 3, near "use strict "
BEGIN not safe after errors--compilation aborted at script2.pl line 4.

Использование правильного синтаксиса script3.pl

#!/usr/bin/perl

use strict ;
use warnings ;

print "Hello world.\n" ;

Вызов perl script3.pl дает

Hello world.

Ответ 2

Вы сделали что-то вроде

use warnings
use strict;

вместо

use warnings;
use strict;

На самом деле, я думаю, что это может быть проблема с окончанием строки. У вас есть LF, где у вас должен быть CR LF или наоборот. Я видел, что Perl считает, что код начинается на полпути через строку shebang (например, perl use strict;)


Как упоминалось в другом месте, код, который вы опубликовали, и код, который вы использовали, различны. Вы действительно использовали

!use strict;

из-за плохой линии shebang.

!#/u...         # Negation followed by a comment

должен быть

#!/u...         # Shebang