我用@
and声明了相同的变量名$
:
@ask=(1..9);
$ask="insanity";
print ("Array @ask\n");
print ("Scalar $ask\n");
不使用use strict
我得到正确的输出但是当我使用use strict
它时给我一个编译错误。
这两个变量是指两个不同的内存位置还是同一个变量?
我用@
and声明了相同的变量名$
:
@ask=(1..9);
$ask="insanity";
print ("Array @ask\n");
print ("Scalar $ask\n");
不使用use strict
我得到正确的输出但是当我使用use strict
它时给我一个编译错误。
这两个变量是指两个不同的内存位置还是同一个变量?
你有两个变量:
@ask
$ask
如果你愿意,你也可以有%ask
(哈希)。然后你会写:
print $ask, $ask[0], $ask{0};
引用标量、数组和散列。
通常,您应该避免这种处理,但变量都非常不同,Perl 不会混淆。
抱怨的唯一原因use strict;
是您没有在变量前面加上my
:
#!/usr/bin/env perl
use strict;
use warnings;
my @ask = (1..9);
my $ask = "insanity";
my %ask = ( 0 => 'infinity', infinity => 0 );
print "Array @ask\n";
print "Scalar $ask\n";
print "Hash $ask{0}\n";
你需要在使用use strict;
它之前先声明你的变量。
例如:
use strict;
my @ask=(1..9);
my $ask="insanity";
print ("Array @ask\n");
print ("Scalar $ask\n");
@ask
并且$ask
是不同的变量 - 按原样%ask
- 这样做并不是错误。然而,这是一种糟糕的风格。
因为当你使用它们时 sigil 会发生变化,例如当你$ask[1]
用来获取 的第二个元素时@ask
,代码变得更难阅读,use strict
也无法判断你是否感到困惑。因此,除非您知道自己在做什么,否则最好使用与印记不同的名称。所以你可以使用例如@asks
和$ask
。
您遇到的错误strict不是由于变量名。这是因为您没有声明变量(使用my、our、local或state之一。您也没有使用vars pragma。
简短的回答:my
在每个变量前面加上一个,你就会符合 -strict
标准。
对于包变量,您可以检查符号表中的条目。$ask
并且@ask
是独立的实体:
#!/usr/bin/env perl
use Devel::Symdump;
use YAML;
@ask=(1..9);
$ask="insanity";
my $st = Devel::Symdump->new('main');
print Dump [ $st->$_ ] for qw(
scalars
arrays
);
除其他外,此代码将输出:
-- … - 主要::问 … --- … - 主要::问 …
例如,当您有一组鱼并且您正在对数组中的每条鱼做一些事情时,能够使用相同的名称会有所帮助:
for my $fish (@fish) {
go($fish);
}
通常,对数组和散列使用复数形式,对数组元素使用单数形式,以及对散列中的键使用基于单数形式的东西更具表现力:
#!/usr/bin/env perl
use strict;
use warnings;
my @ships = ('Titanic', 'Costa Concordia');
my %ships = (
'Titanic' => {
maiden_voyage => '10 April 1912',
capacity => 3_327,
},
'Costa Concordia' => {
maiden_voyage => '14 July 2006',
capacity => 4_880,
},
);
for my $ship (@ships) {
print "$ship\n";
}
while (my ($ship_name, $ship_details) = each %ships) {
print "$ship_name capacity: $ship_details->{capacity}\n";
}