5

我用@and声明了相同的变量名$

@ask=(1..9);
$ask="insanity";
print ("Array @ask\n");
print ("Scalar $ask\n");

不使用use strict我得到正确的输出但是当我使用use strict它时给我一个编译错误。

这两个变量是指两个不同的内存位置还是同一个变量?

4

4 回答 4

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";
于 2013-09-20T07:10:37.603 回答
15

你需要在使用use strict;它之前先声明你的变量。

例如:

use strict;
my @ask=(1..9);
my $ask="insanity";
print ("Array @ask\n");
print ("Scalar $ask\n");
于 2013-09-20T07:11:33.343 回答
1

@ask并且$ask是不同的变量 - 按原样%ask- 这样做并不是错误。然而,这是一种糟糕的风格。

因为当你使用它们时 sigil 会发生变化,例如当你$ask[1]用来获取 的第二个元素时@ask,代码变得更难阅读,use strict也无法判断你是否感到困惑。因此,除非您知道自己在做什么,否则最好使用与印记不同的名称。所以你可以使用例如@asks$ask

于 2013-09-20T10:01:42.670 回答
1

您遇到的错误strict不是由于变量名。这是因为您没有声明变量(使用myourlocalstate之一。您也没有使用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";
}
于 2013-09-20T20:05:51.443 回答