PDSC #0: 一般的な助言
(一部省略)

Tom Christiansen著
< tchrist@perl.com >

リリース 0.2
1995年10月8日(日)


最初にしなければならないことは、単にリストやハッシュを使って、データ構造 のある1個の要素に、(アサインメント経由のように[such as via an assignment])、どのようにアクセスしたいのかはっきりさせることです。 あなたが配列やリンクリストやスタックやキューやデキュー(deque)を考えているのなら@ARRAY(配列)を使って下さい。レコードや構造体や検索テーブルを考えているなら%HASH(ハッシュ)を使って下さい。

  • $coordinates[$row][$col] = "empty"
    これは整数をインデクスとする単純な二次元配列です。各々の最初のレベルの数値インデクス自身がリスト(参照)を作り出します。リストのリストの項参照。

  • $student[$i]{"age"} = 15
    これは名前をつけたフィールドを含んだレコードの配列です。 各々の最初のレベルの数値インデクス(訳注:$iのこと)自身がハッシュ(参照)を作り出します。 ハッシュのリストの項参照。

  • $flight_time{"denver"}[3] = "12:34"
    これはリストの(連想)配列です。 各々の最初のレベルの文字列インデクス自身がリスト(参照)を作り出します。 [Each first level string index itself produces a list (reference).] リストのハッシュの項参照。

  • $tv_shows{"the simpsons"}{"start time"} = "Monday 20:00"
    これは、番組名でショーを検索するのに使う、レコードの参照 テーブルで、フィールド名でレコードフィールドを検索します。 各々の最初のレベルの文字列インデクス自身がハッシュ(参照)を作り出します。 ハッシュのハッシュの項参照。

  • $tv{"the simpsons"}{members}[0]{name} = "homer"
    これは、精巧なデータ構造で、それ自身が時折他の配列やレコードでもある というフィールドを含んだ、混成レコードを内包しています。 さらに精巧なデータ構造の項参照。

  • $rec->{FH}->print( &{ $rec->{FUNC} } ( $rec->{LIST}[0]))
    これは変わったレコードで、ファイルハンドル、関数、および他の文字列、リスト、ハッシュへの参照をそれ自身が含んでいます。 リストフィールドである配列中の最初の要素の引数と一緒にFUNCフィールドの中の関数をコールした結果を、 $rec's FH で参照しているファイルハンドルに出力します。 同様にさらに精巧なデータ構造の項参照。

  • 備考

    この文書の拡張版で、 以下の助言をさらに詳しく取り扱っていますので、参照して下さい。

    一般的な助言

    一般的に興味を引く、もういくつかの助言

    1. 常にuse strict-wを使って下さい。strict は 痛みを伴うかもしれませんが、$a->[$i]を意味しているのに $a[$i]と言ってしまう場合やその逆のケースからあなたを救って くれるでしょう。

    2. push()のようなものは、次のように@ サインを必要とします。
      push @{ $a[3] }, @new_list
      下記のように記述する事はできません。
      push $a[3], @new_list

    3. keys()のようなものは、次のように % サインを必要とします。
      foreach $k (keys %{ $h{"key"} }) { ... }
      下記のように記述する事はできません。
      foreach $k (keys $h{"key"}) { ... }

    4. 構造体に存在するデータへのポインターをストアしてはいけません。 例えば、行毎、語数毎にインデクスをつけた2次元配列を構築するとか、 常に新しい構造体を生成するようにして下さい。
             while ( <> ) {
      	   @fields = split;
      	   push @a, [ @fields ];
             }
      
      これは、通常参照をするには、バックスラッシュを使うのではなく、むしろ   []{}コンストラクターを使用するのだということを意味   しています。 例えば、これは 間違いです。!
             while ( <> ) {
      	   @fields = split;
      	   push @a, \@fields;
             }
      
        これはCにおける以下の問題と同じです。
      	char a[100], *p[10], *somefunc();
      	for (i = 0; i < 10; i++) {
      	    strcpy(a, somefunc(i));
      	    p[i] = a;
      	} 
      

        この規則への例外は、再帰的データ構造を記述する場合や同一のレコードセット用に複数のキーインデクスを生成する場合です。

    5. ${$a[$i]} を意味しているときに$$a[$i]と記述したり、 @{$a[$i]}を意味しているときに@$a[$i]と記述してはなりません。 それらは全く機能しないでしょう。

    6. $a->[$i]を意味していたとしても、$$a[$i]と記述しては なりません。後者のようにしても機能はするのですが、不必要にCプログラマを混乱 させてしまいます。彼らは、その記述は、prefix dereference演算子よりも強固に 結合すると考えているのです。 これはCでは正しいのですが、あちこちに他の方法があるperlでは間違っているのです。

    7. $a[$i]@ai番目の要素ですが、 $a->[$i]は、$aによって指し示されたanon arrayのi番目の要素であるということを銘記しておいて下さい。 use strict と言っておくと助けになることがあります。

    8. 決して
      $a[$i] = [ @list ]
      の代わりに
      @ { $a[$i] } = @list
      と記述してはなりません。 これは機能はしますが、人々を混乱させてしまいます。

    9. 読者が混乱してしまうかもしれないと感じたときはpointer arrows や indirection bracketingを使うよう心がけて下さい。 時には、そうすることでうまく考えを整理するできるでしょう。 以下は、あいまいさを排除するブレースを用いた、5種類のprefix dereferencersの 例です。

    10. 新しいperl5db (ftp to perl.com in /pub/perl/ext/) は、x およびXコマンドを使用している複雑なデータ構造を出力する
      ご意見、ご要望は、 電子メールまたは 投稿にお願い致します。

      ホームページへ戻る。