Perlのハッシュとハッシュ参照の違いは何ですか?
-
08-07-2019 - |
質問
Perlのハッシュを適切に理解したいと思います。私はかなり長い間断続的にPerlを使用しなければなりませんでしたが、ほとんどの場合、Perlはテキスト処理に関連しています。
そして、毎回、ハッシュを処理する必要があり、それはめちゃくちゃになります。ハッシュの構文は非常にわかりにくい
ハッシュとハッシュ参照、それらの違い、必要な場合などについての良い説明をいただければ幸いです。
解決
単純なハッシュは配列に近いです。初期化も似ています。まず配列:
@last_name = (
"Ward", "Cleaver",
"Fred", "Flintstone",
"Archie", "Bunker"
);
次に、同じ情報をハッシュ(別名連想配列)で表現しましょう:
%last_name = (
"Ward", "Cleaver",
"Fred", "Flintstone",
"Archie", "Bunker"
);
同じ名前ですが、配列 @last_name
とハッシュ%last_name
は完全に独立しています。
Archieの姓を知りたい場合は、配列を使用して線形検索を実行する必要があります。
my $lname;
for (my $i = 0; $i < @last_name; $i += 2) {
$lname = $last_name[$i+1] if $last_name[$i] eq "Archie";
}
print "Archie $lname\n";
ハッシュを使用すると、構文的にはるかに直接的になります:
print "Archie $last_name{Archie}\n";
わずかにリッチな構造で情報を表現したい場合:
- Cleaver(姓)
- ワード(名)
- 6月(配偶者の名)
- フリントストーン
- フレッド
- ウィルマ
- バンカー
- Archie
- エディット
参照が登場する前は、フラットなキーと値のハッシュはできる限り最善でしたが、参照は許可します
my %personal_info = (
"Cleaver", {
"FIRST", "Ward",
"SPOUSE", "June",
},
"Flintstone", {
"FIRST", "Fred",
"SPOUSE", "Wilma",
},
"Bunker", {
"FIRST", "Archie",
"SPOUSE", "Edith",
},
);
内部では、%personal_info
のキーと値はすべてスカラーですが、値は特別な種類のスカラーです: {}
で作成されたハッシュ参照。この参照により、「多次元」をシミュレートできます。ハッシュ。たとえば、次の方法でウィルマにアクセスできます
$personal_info{Flintstone}->{SPOUSE}
Perlでは添え字間の矢印を省略することができるため、上記は同等です
$personal_info{Flintstone}{SPOUSE}
Fredの詳細を知りたい場合は入力が多いので、カーソルのような参照を取得できます。
$fred = $personal_info{Flintstone};
print "Fred's wife is $fred->{SPOUSE}\n";
上のスニペットの $ fred
はハッシュ参照であるため、矢印が必要です。このようなエラーをキャッチするのに役立つように use strict
を賢明に有効にしておくと、コンパイラは文句を言います:
Global symbol "%fred" requires explicit package name at ...
Perl参照は、CおよびC ++のポインターに似ていますが、nullになることはありません。 CおよびC ++のポインターは逆参照を必要とするため、Perlの参照も必要です。
CおよびC ++関数のパラメーターには、値渡しのセマンティクスがあります。これらは単なるコピーであるため、変更は呼び出し元に戻りません。変更を確認するには、ポインターを渡す必要があります。 Perlでの参照でこの効果を得ることができます:
sub add_barney {
my($personal_info) = @_;
$personal_info->{Rubble} = {
FIRST => "Barney",
SPOUSE => "Betty",
};
}
add_barney \%personal_info;
バックスラッシュなしでは、 add_barney
は、subが戻るとすぐに破棄されるコピーを取得します。
&quot;ファットコンマ&quot;の使用にも注意してください。 ( =&gt;
)上記。左側の文字列を自動引用し、ハッシュの初期化の構文上のノイズを減らします。
他のヒント
以下は、ハッシュとハッシュ参照の使用方法を示しています。
my %hash = (
toy => 'aeroplane',
colour => 'blue',
);
print "I have an ", $hash{toy}, " which is coloured ", $hash{colour}, "\n";
my $hashref = \%hash;
print "I have an ", $hashref->{toy}, " which is coloured ", $hashref->{colour}, "\n";
perldoc perldsc も参照してください。
ハッシュは、Perlの基本的なデータ型です。 キーを使用してそのコンテンツにアクセスします。
ハッシュrefはaの略語です ハッシュへの参照。参照は スカラー、つまり単純な値。それは を含むスカラー値 基本的に、実際の ハッシュ自体。
リンク: perlのハッシュとハッシュrefの違い-Ubuntuフォーラム
削除の構文にも違いがあります。 Cと同様に、perlはハッシュに対して次のように機能します。
delete $hash{$key};
およびハッシュ参照用
delete $hash_ref->{$key};
Perl Hash Howto はハッシュ参照とハッシュ対ハッシュを理解するための優れたリソース
別のリンクもありますここにはperlと参照に関する詳細情報があります。
perldoc perlreftut をご覧ください。これは、ご使用のコンピューターのコマンドラインからもアクセスできます。
参照は、配列全体またはハッシュ全体(または他のほぼすべて)を参照するスカラー値です。名前は、すでによく知っているリファレンスの一種です。米国の大統領を考えてみてください:厄介で不便な血液と骨の袋。しかし、彼について話したり、コンピュータープログラムで彼を表現したりするために必要なのは、簡単で便利なスカラー文字列「Barack Obama」だけです。
Perlの参照は、配列とハッシュの名前のようなものです。これらはPerlのプライベートな内部名であるため、明確であることを確認できます。 「バラクオバマ」とは異なり、参照は1つのもののみを参照し、それが何を参照するかは常に知っています。アレイへの参照がある場合、そこからアレイ全体を回復できます。ハッシュへの参照がある場合、ハッシュ全体を回復できます。しかし、参照は依然として簡単でコンパクトなスカラー値です。