use utf8;
use v5.14.0;
@rocks = qw/ bedrock slate rubble granite /;
while( ( $index, $value ) = each @rocks ) {
say "$index: $value\n";
}
输出:
C:\Users\J\Documents\Development\perl>perl test.pl
Global symbol "@rocks" requires explicit package name at test.pl line 6.
Global symbol "$index" requires explicit package name at test.pl line 7.
Global symbol "$value" requires explicit package name at test.pl line 7.
Global symbol "@rocks" requires explicit package name at test.pl line 7.
Global symbol "$index" requires explicit package name at test.pl line 8.
Global symbol "$value" requires explicit package name at test.pl line 8.
Execution of test.pl aborted due to compilation errors.
我已经读到,不包括使用严格和使用警告可以使人们规避此问题。但是,我已经删除了严格的警告,就在这里。我知道不使用严格是非常危险的,但是我只是在玩代码。必须输入
my @rocks = qw/ bedrock slate rubble granite /;
while( (my $index, my $value ) = each @rocks ) {
say "$index: $value\n";
}
当您在玩耍时有点烦人。
似乎
use v5.14.0;
正在打开严格或警告;真的吗?如果是这样,怎么办?
如果是的话,如何能够使用say
而不必在每个sodding变量前加上$my
?如果文件中没有use v5.14.0.;
行,我似乎无法使用say。
答案 0 :(得分:2)
似乎
use v5.14.0;
正在开启严格或警告;真的吗?如果可以,怎么办?
不幸的是,此文档埋藏在the documentation for use
中。
use VERSION还可以按词法启用由功能编译指示定义的请求版本中的所有可用功能,从而禁用请求版本的功能包中未包含的所有功能。查看功能。 类似地,如果指定的Perl版本大于或等于5.12.0,则会像使用use strict一样在词法上启用严格。 使用VERSION,即使它在它之前。以后使用use VERSION将覆盖先前使用VERSION的所有行为,可能会删除use VERSION添加的strict和功能。使用VERSION不会加载feature.pm或strict.pm文件。
如果这样的话,我如何能够使用say而不用为每个sodding变量加上$ my前缀?
您可以使用use feature
分别加载功能。 use feature "say"
这样。您还可以使用use v5.10
来加载5.12.0之前的feature bundle。
但是您确实非常希望严格执行。真的真的真的。使用my
显式声明变量具有两个重要功能:错字保护和词法作用域。错字保护很明显,如果您键入$receiver = 42
,然后再键入print $reciever
,您可能会花很多时间挠头,直到您发现自己有错字。这不仅仅可以弥补输入my
所花费的时间。
词法作用域同样重要。这意味着该变量仅存在于声明它的块中。
use strict;
sub foo {
my $thing = 42;
}
print $thing; # error
默认情况下,没有my
变量是全局变量。任何地方的任何代码段都可以随时触摸全局变量。这使得除了最小的代码段之外的所有代码段都变得更复杂且更难以理解,并将其变成 NIGHTMARES ,供以后需要维护的人们使用。您还冒着意外地将同一变量用于两个不同目的的风险,特别是使用$count
或$i
之类的通用名称时,会神秘地覆盖彼此的值。