【问题标题】:Why should I specify a use statement when using the say function?为什么在使用 say 函数时要指定 use 语句?
【发布时间】:2016-05-12 10:56:47
【问题描述】:

这个问题可能很愚蠢。但我刚刚开始探索 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。为什么我要在这里使用use 声明来提及 Perl 版本?

【问题讨论】:

    标签: perl


    【解决方案1】:

    默认情况下不启用可能破坏向后兼容性的功能。

    见perldoc feature:

    通常不可能在不破坏某些现有程序的情况下向 Perl 添加新语法。此编译指示提供了一种将风险降至最低的方法。新的句法结构,或旧结构的新语义,可以通过使用 feature 'foo' 来启​​用,并且只有在适当的功能编译指示在范围内时才会被解析。 (尽管如此,CORE:: 前缀提供了对所有 Perl 关键字的访问,不管这个 pragma。)

    use 在版本号上,隐式启用所有功能,因为它还对 perl 版本应用了约束。因此,例如,您不会被say 未实施而绊倒。

    【讨论】:

    • 我想指出一些以前语法错误的功能可能不需要use 语句来启用。
    • 我认为你的意思是像 s/pattern/newpattern/r 和 $var // 0 类型的东西?对,那是正确的。他们不会破坏向后兼容性。您仍然可以通过use 强制执行最低 perl 版本(如果您正在做与版本相关的事情,可能应该这样做)
    【解决方案2】:

    say 是一个功能,它不是(还——将来会是吗?)常规 perl 语法。

    使用任一

    use feature qw(say);
    

    或

    use v5.010; # or any version later
    

    【讨论】:

    • 我认为永远不会,因为这是一个向后兼容性和设计问题。从历史上看,perl 并没有使以前的“好”代码失效,这就是为什么例如strict 和 warnings 是可选的,尽管这是一个非常好的主意。
    猜你喜欢
    • 1970-01-01
    • 2013-07-11
    • 2011-12-26
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2023-03-04
    • 2017-01-03
    • 1970-01-01
    相关资源
    最近更新 更多