アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
あるサイトで下記のようなサンプルをみつけました。

-------------------------------------------------------------
use SOAP::Lite;
use MIME::Entity;
my $soap = SOAP::Lite
->uri($NS)
->proxy($HOST);
my $som = $soap->foo();
★foreach my $part (${$som->parts}) {
★ print $part->stringify;
}
-------------------------------------------------------------

実際に動かしてみたのですが"Not a SCALAR reference"エラーで動きません。
実のところあまり意味がわかっていなかったので、どのような動きかを調べてみましたが、★のところがわかりませんでした。

★の部分などは、perlの一般的な書き方だと思っていたのですが、調べた限り意味がわかりません。
これはどういう意味なのでしょうか?ご教授いただけたらと思います。

$som->partsをprintすると、"ARRAY(0xxxxx)"が出力されます。
普通の配列を出力してもARRAY(0xxxx)とは出力されませんよね?これはどういう意味なんだろう・・・

A 回答 (1件)

> $som->partsをprintすると、"ARRAY(0xxxxx)"が出力されます。


> 普通の配列を出力してもARRAY(0xxxx)とは出力されませんよね?これはどういう意味なんだろう・・・

これは、$som->parts が配列のリファレンスであることを示しています。
Cがわかるならポインタのようなもんだと思ってください。

最近のPerlプログラミングにおいてはリファレンスは
非常に重要な概念ですので、よく調べておくことをお奨めします。

とりあえず
perldoc perlref
で入門レベルの知識は得られます。
#探せば日本語訳もあるでしょう

んで、
>実際に動かしてみたのですが"Not a SCALAR reference"エラーで動きません。

このエラーは

> ★foreach my $part (${$som->parts}) {

ここで出てませんでしたか?
最初に書いたとおり、$som->parts は配列のリファレンスなのに、
スカラーのリファレンスとして解決しようとしているので、

> "Not a SCALAR reference"
「スカラーのリファレンスじゃないわ、ボケっ」
と文句たれてるわけです。
そもそも、for ループの処理対象なので、スカラーがここに置かれるのは
おかしいですね。
写し間違いとかありませんか?

たぶん、@{$som->parts} が正しいと思うんですが。

> ★ print $part->stringify;

こっちはたぶんSOAP使って呼び出したところの
仕様によるんで断言できませんけど、
名前からするとクラスを文字列化してるんじゃないですかね。
要はわかりやすいであろう形式にするメソッドだと思います。

あと、本なら初めてのPerlあたりを読んどくといいんじゃないでしょうか。
日本人の筆者が書いた書籍ではリファレンスを
きちんと説明した本はなかったと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
エラーの原因はまさに、おっしゃる通りでした。

for文の指定で、特別なスカラーを入れて回す特殊な方法なのかと、悩んでいました。
おそらく、"@{$som->parts}"の書き間違えかと思います。

取り出した配列の中身が、ハッシュのリファレンスだったりと、解決後も多少四苦八苦しましたが、
リファレンス=Cのポインタのイメージで追っていったら解決できました。

ありがとうございました。

お礼日時:2007/12/05 14:35

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