65

Perlのハッシュをきちんと理解したいです。私はかなり長い間 Perl を断続的に使用しなければなりませんでしたが、ほとんどの場合、Perl を使用する必要があるときはいつでも、それは主にテキスト処理に関連しています。

そして毎回、ハッシュを処理する必要があり、めちゃくちゃになります。ハッシュの構文は非常に不可解だと思います

ハッシュとハッシュ参照、それらの違い、必要な場合などの適切な説明をいただければ幸いです。

4

4 に答える 4

91

単純なハッシュは配列に近いです。それらの初期化も似ています。最初の配列:

@last_name = (
  "Ward",   "Cleaver",
  "Fred",   "Flintstone",
  "Archie", "Bunker"
);

同じ情報をハッシュ (別名連想配列) で表現してみましょう。

%last_name = (
  "Ward",   "Cleaver",
  "Fred",   "Flintstone",
  "Archie", "Bunker"
);

名前は同じですが、配列@last_nameとハッシュ%last_nameは完全に独立しています。

配列を使用して、アーチーの姓を知りたい場合は、線形検索を実行する必要があります。

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";

少しリッチな構造で情報を表現したいとします。

  • クリーバー(姓)
    • ウォード(名)
    • ジューン(配偶者の名)
  • フリントストーン
    • フレッド
    • ヴィルマ
  • 陣地壕
    • アーチー
    • エディス

参照が登場する前は、フラットなキー値ハッシュが私たちにできる最善のことでしたが、参照は可能です

my %personal_info = (
    "Cleaver", {
        "FIRST",  "Ward",
        "SPOUSE", "June",
    },
    "Flintstone", {
        "FIRST",  "Fred",
        "SPOUSE", "Wilma",
    },
    "Bunker", {
        "FIRST",  "Archie",
        "SPOUSE", "Edith",
    },
);

内部的には、 のキーと値%personal_infoはすべてスカラーですが、値は特別な種類のスカラーです: で作成されたハッシュ参照{}です。参照により、「多次元」ハッシュをシミュレートできます。たとえば、次の方法で Wilma にアクセスできます。

$personal_info{Flintstone}->{SPOUSE}

Perl では添字間の矢印を省略できることに注意してください。したがって、上記は次のようになります。

$personal_info{Flintstone}{SPOUSE}

Fred についてもっと知りたい場合、これは大量の入力になるため、カーソルのようなものとして参照を取得できます。

$fred = $personal_info{Flintstone};
print "Fred's wife is $fred->{SPOUSE}\n";

上記$fredのスニペットは hashref であるため、矢印が必要です。省略しても、この種のエラーをキャッチできるように賢明に有効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サブが戻るとすぐに破棄されるコピーを取得していたでしょう。

上記の「太いコンマ」( =>) の使用にも注意してください。左側の文字列を自動引用符で囲み、ハッシュの初期化の構文上のノイズを減らします。

于 2009-11-30T02:38:14.690 に答える
16

以下は、ハッシュとハッシュ参照の使用方法を示しています。

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も参照してください。

于 2009-11-30T02:34:58.503 に答える
10

ハッシュは Perl の基本的なデータ型です。キーを使用してコンテンツにアクセスします。

ハッシュ参照は、ハッシュへの参照の省略形です。参照はスカラー、つまり単純な値です。これは、本質的に実際のハッシュ自体へのポインターを含むスカラー値です。

リンク: perl のハッシュとハッシュ参照の違い - Ubuntu フォーラム

削除の構文にも違いがあります。C と同様に、Perl はハッシュに対して次のように動作します。

delete $hash{$key};

およびハッシュ参照用

delete $hash_ref->{$key};

Perl Hash Howtoは、Hash と Hash with Hash を理解するための優れたリソースです。

perl と参照に関する詳細情報が記載された別のリンクもここにあります。

于 2009-11-30T01:07:14.723 に答える
7

自分のコンピューターのコマンドラインからもアクセスできるperldoc perlreftutを参照してください。

参照は、配列全体またはハッシュ全体 (またはその他のもの) を参照するスカラー値です。名前は、あなたがすでによく知っている一種の参照です。米国大統領のことを考えてみてください。血と骨が詰まった、ごちゃごちゃした不便な袋です。しかし、彼について話したり、コンピューター プログラムで彼を表現したりするために必要なのは、簡単で便利なスカラー文字列 "Barack Obama" だけです。

Perl での参照は、配列とハッシュの名前のようなものです。これらは Perl のプライベートな内部名であるため、明確であることを確認できます。「バラク・オバマ」とは異なり、参照は 1 つのことのみを参照し、それが何を参照しているかは常にわかります。配列への参照がある場合は、そこから配列全体を復元できます。ハッシュへの参照がある場合は、ハッシュ全体を復元できます。しかし、参照は依然として簡単でコンパクトなスカラー値です。

于 2009-11-30T01:25:06.860 に答える