WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:リファレンスの渡し方

0:[投稿] けい [2002/12/12 21:21 ][環境:windows2000 UNIX]

リファレンスについて理解しようと、下に方法1〜3までの
ハッシュに関するリファレンスを生成したのですが、
下の3つの文字列と改行しか出力されません。
方法1
方法2
方法3
よろしければ、間違いをご指摘いただけると非常にありがたいです。本当にすいません。よろしくお願いします。

%FORM = ("A" => 1,
        "B" => 2,
        "C" => 3
        );

# 方法1
{
    print "方法1\n";
    my $tmp = \%FORM; # リファレンスを渡す
    &printhash($tmp);
    print "\n\n";
}

# 方法2
{
    print "方法2\n";
    &printhash(\%FORM);
    print "\n\n";
}

# 方法3
{
    print "方法3\n";
    &printhash("\%FORM");
    print "\n\n";
}

sub printhash
{
    my $ref_hash = @_;
    
    while ( ($key, $value) = each(%$ref_hash) )
    {
        print "$key = $value";
    }
}


1:[回答] やじうま1号 [2002/12/12 21:40 ]

printhashルーチンの
%$ref_hash

$%ref_hash
にするとどうなります?


2:[回答] ふじ [URL] [2002/12/12 22:10 ]

> my $ref_hash = @_;
my($ref_hash) = @_;
もしくは
my $ref_hash = shift;
ですね。
スカラコンテキストで配列を代入すると、$ref_hash には @_ の要素数
(この場合は 1)が入ってしまいます。

正しい渡し方は方法 1 と 2 です。3は %FORM という文字列が渡るので
意図した結果になりません。

こういうときに便利なモジュールとして、Data::Dumper があります。
(Perl5.005以降は標準のはず)
スクリプトの最初のほうに

use Data::Dumper;

を入れて、

my($ref_hash) = @_;
print Dumper($ref_hash);

などとしてみましょう。
リファレンスがネストするような複雑なデータでも、
構造を見やすい形で表示してくれます。


3:[完了] atusi [2002/12/13 10:09 ]

ありがとうございました。
なるほど、そういうことだったのですね。
スカラコンテキストで評価されていたんですね。

基本からもう一度勉強してみます。
どうもありがとうございました。


4:[完了] けい [2002/12/13 10:10 ]

すいません、クッキーを食っているため別の
名前になってしまいました。すいません。
ご迷惑をおかけしました。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World