12

我正在尝试使用以下约定,我被指示为我的"Hello, World!"程序使用良好/正确/安全的 Perl 代码:

use strict;
use warnings;

我在我的主 Windows 7 操作系统上使用 (Strawberry) Perl 5.12 创建并成功运行了以下“Hello World”程序:

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

print "Hello, World!\n";

正如预期的那样,我得到的结果是"Hello, World!"

令我感到非常奇怪的是,使用 Perl 5.14 在我的虚拟化 Linux Mint 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.

我随后创建了其他没有use strict;oruse warnings;行的“Hello World”程序,还有一个带有 的程序-w,我在一些教程中看到过,如果我没记错的话,会打开警告。

我的两个替代版本都可以正常工作,因为它们产生了我的预期结果:

Hello, World!

我不能确定的是,我是否需要use5.14 及更高版本的 Perl 程序中的语句,或者是否可以-w在第一行的末尾写下。

我想我可以在我所有的 Perl 程序中使用一致的标头,可以这么说,无论它们是 Windows 还是 Linux,Perl 5.12 或 5.14 或其他。

4

2 回答 2

17

您的图像显示所有脚本都以!#/usr/bin/perl. 这是错误的。这不是一个有效的 she-bang 行,它被读作 negation!后跟一个 comment #。解析将继续并使用script1.pl perl 将执行! print "Hello world.\n";。这将打印Hello world并否定print... 不是真正有用但有效的 perl 的结果。

script2.pl perl 看到! use strict;这是一个编译时错误,因此 perl 失败并报告该行的错误use strict;

因此,如果您使用正确的 she-bang 行,所有三个脚本都将按设计工作。

编辑(添加了测试脚本):

脚本1.pl

!#/usr/bin/perl

print "Hello world.\n" ;

打电话perl script1.pl

Hello world.

脚本2.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.
于 2013-01-14T08:51:04.653 回答
9

你做了类似的事情

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
于 2013-01-13T07:16:27.800 回答