我使用@
和$
声明了相同的变量名:
@ask=(1..9);
$ask="insanity";
print ("Array @ask\n");
print ("Scalar $ask\n");
不使用use strict
我正确输出输出但是当我使用use strict
时,它会给我一个编译错误。
这两个变量是指两个不同的内存位置还是相同的变量?
答案 0 :(得分:21)
你有两个变量:
@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";
答案 1 :(得分:15)
使用use strict;
,您需要先使用它来声明变量。
例如:
use strict;
my @ask=(1..9);
my $ask="insanity";
print ("Array @ask\n");
print ("Scalar $ask\n");
答案 2 :(得分:1)
@ask
和$ask
是不同的变量 - 就像%ask
一样 - 这样做并不是错误。然而风格很差。
因为使用它们时sigil会发生变化,例如当您使用$ask[1]
获取@ask
的第二个元素时,代码会变得更难以阅读,而use strict
也将不会能够分辨你是否感到困惑。因此,除非你知道自己在做什么,否则使用不同于sigil的名称是个好主意。所以你可以使用例如@asks
和$ask
。
答案 3 :(得分:1)
strict导致的错误不是由于变量名称造成的。这是因为您没有声明变量(使用my,our,local或state之一。您也没有使用vars编译指示。
简短回答:在每个变量前粘贴一个my
,您将符合strict
条款。
对于包变量,您可以检查symbol table中的条目。 $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
);
除此之外,此代码将输出:
-- … - main::ask … --- … - main::ask …
能够使用相同的名称可以帮助你说,如果你有一系列鱼,你正在对阵中的每条鱼做一些事情:
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";
}