作为一个新手,我正在尝试使用来自 atlanta perl mongers 的材料来探索 perl 数据结构,可在此处获得Perl Data Structures
这是我编写的示例代码,与其他两个 pragma01.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);
上述文件中提到的几点我误解了:
第 1
页 44 提到这两种语法结构:"$$href{'name'}"
并且"$$aref[0]"
永远不应该用于访问值。为什么 ?似乎在我的代码中它们工作正常(见下文),而且 perl 抱怨使用@{$aref}->[0]
as deprecated,那么哪一个是正确的?
第 2
页 45 提到没有"use strict"
和使用"$href{'SomeKey'}"
when"$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