【发布时间】:2012-12-27 20:44:58
【问题描述】:
作为一个新手,我正在尝试使用来自 atlanta perl mongers 的材料来探索 perl 数据结构,可在此处获得 Perl Data Structures
这是我编写的示例代码,01.pl 与 02.pl 相同,但 01.pl 包含另外两个 pragma:use strict; use warnings;。
#!/usr/bin/perl
my %name = (name=>"Linus", forename=>"Torvalds");
my @system = qw(Linux FreeBSD Solaris NetBSD);
sub passStructure{
my ($arg1,$arg2)=@_;
if (ref($arg1) eq "HASH"){
&printHash($arg1);
}
elsif (ref($arg1) eq "ARRAY"){
&printArray($arg1);
}
if (ref($arg2) eq "HASH"){
&printHash($arg2);
}
elsif (ref($arg2) eq "ARRAY"){
&printArray($arg2);
}
}
sub printArray{
my $aref = $_[0];
print "@{$aref}\n";
print "@{$aref}->[0]\n";
print "$$aref[0]\n";
print "$aref->[0]\n";
}
sub printHash{
my $href = $_[0];
print "%{$href}\n";
print "%{$href}->{'name'}\n";
print "$$href{'name'}\n";
print "$href->{'name'}\n";
}
&passStructure(\@system,\%name);
上面文件中提到的几点我误解了:
第一
第 44 页提到这两种语法结构:"$$href{'name'}" 和 "$$aref[0]" 永远不应该用于访问值。为什么 ?似乎在我的代码中它们工作正常(见下文),而且 perl 抱怨不推荐使用 @{$aref}->[0],那么哪个是正确的?
第二
第 45 页提到,如果不使用 "use strict" 并在应使用 "$href->{'SomeKey'}" 时使用 "$href{'SomeKey'}",则会隐式创建 %href。所以如果我理解得很好,下面的两个脚本都应该打印“Exists”
[pista@HP-PC temp]$ perl -ale 'my %ref=(SomeKey=>'SomeVal'); print $ref{'SomeKey'}; print "Exists\n" if exists $ref{'SomeKey'};'
SomeVal
Exists
[pista@HP-PC temp]$ perl -ale ' print $ref{'SomeKey'}; print "Exists\n" if exists $ref{'SomeKey'};'
但是第二个不会,为什么?
两个开头提到的脚本的输出:
[pista@HP-PC temp]$ perl 01.pl
Using an array as a reference is deprecated at 01.pl line 32.
Linux FreeBSD Solaris NetBSD
Linux
Linux
Linux
%{HASH(0x1c33ec0)}
%{HASH(0x1c33ec0)}->{'name'}
Linus
Linus
[pista@HP-PC temp]$ perl 02.pl
Using an array as a reference is deprecated at 02.pl line 32.
Linux FreeBSD Solaris NetBSD
Linux
Linux
Linux
%{HASH(0x774e60)}
%{HASH(0x774e60)}->{'name'}
Linus
Linus
【问题讨论】:
标签: perl syntax dereference