初心者として、私はここで入手可能な atlanta perl mongers のこの資料を使用して perl データ構造を探索しようとしていますPerl Data Structures
これは私が書いたサンプルコードです。これ01.pl
は と同じですが、追加の 2 つのプラグマ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);
上記のドキュメントには、私が誤解した点がいくつかあります。
最初
のページ 44 は、これらの 2 つの構文構造について述べてい"$$href{'name'}"
ます"$$aref[0]"
。なんで ?私のコードでは正常に動作しているようです (以下を参照)。さらに、perl は@{$aref}->[0]
非推奨として使用することについて不平を言っています。どちらが正しいですか?
2
ページ 45 では、使用する必要がある場合にwithout"use strict"
および using を使用すると、暗黙のうちに作成されることが言及されています。したがって、私がそれをよく理解していれば、次のスクリプトは両方とも「存在します」と出力するはずです"$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'};'
しかし、2番目はなぜですか?
最初に言及した 2 つのスクリプトの出力:
[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