在Perl中使用@和$使用相同的变量名

时间:2013-09-20 07:07:50

标签: perl

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

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

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

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

4 个答案:

答案 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导致的错误不是由于变量名称造成的。这是因为您没有声明变量(使用myourlocalstate之一。您也没有使用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";
}