電子書籍の厳選無料作品が豊富!

PHPを毎日書いている者ですが、たまたまPerlのメールフォームをカスタマイズ
しなければならなくなりました。

use strict宣言がある場合、変数はmyまたはlocalで宣言しなければいけないようですが、
サブルーチン内に

sub form {
・・・
my ($form_value,$error_list) = @_;
・・・
print $error_list{'inquiry_type1'}

としたところ、

Global symbol "%error_list" requires explicit package name at ・・・

と、宣言が無い場合に出るというエラーが出ました。

$error_listには、inquiry_type1は入っているはずなのですが、どのような
宣言をすればよいのでしょうか?

よろしくお願いします。

A 回答 (1件)

Perlの場合、


$a (変数)

@a (リスト) , $a[0] (リストの0番目の要素)

%a (ハッシュ) , $a{'key'} (ハッシュの'key'の要素)
とは別です。

また、「ハッシュ」と「無名のハッシュ/ハッシュのリファレンス」も扱いが違います。

この部分だけでは、正しい対処はわかりません。

・呼出側で func($form_value, %error_list) のようになっている場合:
@_は「スカラーが一つとハッシュの中身」を並べたリストになり、関数内で復元させるなら
my ($form_value,%error_list) = @_;
です。

・呼出側で func($form_value, $error_list) のようになっている場合:
my ($form_value,$error_list) = @_; で正しく、
$error_list{'inquiry_type1'} が間違いです。
$error_listが示すハッシュのリファレンスの中にアクセスするには $error_list->{'inquiry_type1'}のようにします。


名前のこととリファレンスは基本事項なので覚えてください。
    • good
    • 0
この回答へのお礼

無事解決しました。ありがとうございました。

$error_list{'inquiry_type1'}ではなく、$error_list->{'inquiry_type'}が正しかったようです。

ハッシュやリファレンスなど、Perlに慣れていないためあやふやなまま進めていたのが原因でした。今後勉強しようと思います。

お礼日時:2011/08/21 12:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!