Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl抱怨全局符号需要显式的包名,尽管有严格的警告和关闭的警告_Perl - Fatal编程技术网

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