- ベストアンサー
Perlで配列の値が関数に引き継がれない原因と解決方法
- Perlでレンタルサーバ上でプログラムを作成している際、配列の値が関数に引き継がれない問題が発生しました。この問題の原因として、別のサーバへの移行時に配列の引数が正しく引き継がれていない可能性が考えられます。また、呼び出し先で行われているwhile文の追加によって問題が解決されましたが、その理由は配列の値が参照可能になったためです。
- 問題の原因として考えられる点は、移行時に関数の引数の受け渡し方法や配列の扱いに関する違いがあることです。また、while文の追加によって問題が解決されたのは、each関数が配列の内部ポインタを操作するため、while文の前で配列のポインタが終端に位置していた可能性があるためです。そのため、while文を一つ追加することでポインタが先頭に戻り、配列の値が参照可能になったと考えられます。
- この問題を解決するためには、移行先サーバと元のサーバの環境や設定の違いを確認し、特に関数の引数の受け渡し方法や配列の扱いについて注意する必要があります。また、each関数や配列のポインタ操作についても理解しておくと良いでしょう。さらに、問題が発生した場合には、配列の内容を表示するなどデバッグを行い、原因を特定して対応することが重要です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> (1)元のサーバでは問題なく動作していたのですが、..... 私自身使ったことがないのでよくわからないのですが、mod_perl 等の常駐型の Perl を使うとグローバル変数などに不都合が出るというのは聞いたことがあります。サーバを変更して正しく動作しなくなったのなら、その可能性もあると思います。 > (2)呼び出し先でwhile文を一つ入れることで、配列の ..... ハッシュは iterator (反復子) と呼ばれる内部的な変数で、どこまで読んだか記憶しています。while ループで空リストを返すまで実行すれば iterator はリセットされますが、そうでない場合は次の位置から再開されることになります。次のコードを参照してみてください。 %hash = (one => 1, two => 2, three => 3); @key_list = keys %hash; print "1回目:\n"; while (($key, $value) = each %hash) { print "$key => $value\n"; last if $key eq $key_list[-1]; } print "2回目:\n"; while (($key, $value) = each %hash) { print "$key => $value\n"; } print "3回目:\n"; while (($key, $value) = each %hash) { print "$key => $value\n"; } 上のコードは1回目は出力されますが、iterator はリセットされていません。2回目は何も出力しませんが、質問の余計な while と同様に iterator をリセットします。そのため、3回目は出力されることになります。keys や values はその都度 iterator をリセットするので、次のようにするのも一方法かと思います。 foreach $key (keys %DATA1) { $value = $DATA1{$key}; ...
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
今どきの Perl ならリファレンスを使うところだなぁ. ちょ~古代の Perl だったらしょうがないけど.
お礼
配列ではなくてハッシュって言うんですね。よくわからずに 使っていました。ご指摘のようにリセットされていないので whileでループしないのかもしれません。 大変参考になりました。ありがとうございました。