Wak*_*nka 3 syntax perl dereference
作为一个新手,我正在尝试使用atlanta perl mongers的这种材料来探索perl数据结构,这里有可用的Perl数据结构
下面是我writen示例代码,01.pl
是一样的02.pl
,但01.pl
包含了两个额外的编译指示: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);
Run Code Online (Sandbox Code Playgroud)
我误解了上述文件中提到的几点:
第1
页44提及这两个语法结构:"$$href{'name'}"
与"$$aref[0]"
不应该永远被用于访问值.为什么?似乎在我的代码中他们工作正常(见下文),而且perl抱怨使用@{$aref}->[0]
as deprecated,那么哪一个是正确的?
第二
页提到,如果不"use strict"
使用和"$href{'SomeKey'}"
何时"$href->{'SomeKey'}"
使用,%href
则会产生隐含的影响.因此,如果我理解得很好,以下脚本应该打印"存在"
[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'};'
Run Code Online (Sandbox Code Playgroud)
但第二个不会,为什么?
输出两个开头提到的脚本:
[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
Run Code Online (Sandbox Code Playgroud)
许多人认为$$aref[0]
丑陋$aref->[0]
而不丑陋.其他人不同意; 前一种形式没有错.
@{$aref}->[0]
另一方面,这是一个错误,恰好工作但被弃用,可能不会继续.
您可能需要阅读http://perlmonks.org/?node=References+quick+reference
包变量%href
是简单地通过提这样的散列而不创建use strict "vars"
在实际上,通过在离开例如->
出来的$href->{'SomeKey'}
.这并不意味着创建了特定的密钥.
更新:查看Perl最佳实践参考书(这本书激发了更多的盲目采用并且比作者想要的更少的实际思考),它特别推荐该->
表格,以避免遗漏一个印记的可能性,导致上面提到的问题P45.
归档时间: |
|
查看次数: |
469 次 |
最近记录: |