Perl抱怨全局符号需要显式的包名,尽管有严格的警告和关闭的警告
输出:Perl抱怨全局符号需要显式的包名,尽管有严格的警告和关闭的警告,perl,Perl,输出: 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\D
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";
}
正在打开“严格”或“警告”;这是真的吗?如果是,如何?
如果是这样,我如何才能使用比如说,而不必在每个sodding变量前面加$my
?似乎我不能使用say而不使用v5.14.0代码>在我的文件中
似乎使用了v5.14.0代码>正在打开“严格”或“警告”;这是真的吗?如果是,如何
不幸的是,这方面的文件被埋在了地下
“使用版本”还按照功能杂注的定义,在词汇上启用所请求版本中可用的所有功能,禁用所请求版本的功能包之外的任何功能。请参阅功能类似地,如果指定的Perl版本大于或等于5.12.0,则严格按照词汇启用,就像使用严格一样。任何明确使用严格或不严格的用法都会覆盖使用版本,即使在它之前。稍后使用use版本将覆盖以前使用版本的所有行为,可能会删除use版本添加的严格和功能。使用版本不会加载feature.pm或strict.pm文件
如果是这样,我如何才能使用say而不必在每个sodding变量前面加$my
可以使用单独加载要素。所以使用功能“说”
。您还可以使用使用v5.10
加载5.12.0之前的版本
但你真的,真的,真的想要严格控制。真的真的。使用my
显式声明变量提供了两个重要特性:打字保护和词法范围。打字保护是显而易见的,如果你键入$receiver=42
然后再键入print$receiver
,你可能会花很多时间挠头,直到你意识到自己有打字错误。这足以弥补键入my
所花费的时间
同样重要的是词汇范围界定。这意味着变量只存在于其声明所在的块中
use v5.14.0;
如果没有my
,默认情况下变量是全局变量。任何地方的任何代码都可以在任何时候接触全局变量。这使得除了最小的代码片段之外的所有代码都变得更复杂、更难理解,并且对于以后不得不维护它的人来说,它们变成了噩梦。您还可能会出于两个不同的目的意外使用同一变量,特别是使用诸如$count
或$i
之类的通用名称,从而神秘地覆盖彼此的值。谢谢。在同一时间到达那里:-)当然,你想怎么做就怎么做——但这不是“雅达雅达”。同样重要的是,当你玩的时候,你真的可以把事情搞砸。而且警告特别好(即使在一行中,我也总是打开它)。键入my
有多难?如果它出现太多次,也许你可以改进你的测试方式,这样它就不会出现了?我的意见,是建设性的,是出于善意的:)啊,但这不是我的——这是我的。这比我的:-)多50%@JL_SO$my
?你错了@如果你找到了答案,请将其作为答案发布。不要把它编辑成问题
use strict;
sub foo {
my $thing = 42;
}
print $thing; # error