お世話になります。
あるサイトで下記のようなサンプルをみつけました。
-------------------------------------------------------------
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)とは出力されませんよね?これはどういう意味なんだろう・・・
No.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あたりを読んどくといいんじゃないでしょうか。
日本人の筆者が書いた書籍ではリファレンスを
きちんと説明した本はなかったと思います。
ご回答ありがとうございます!
エラーの原因はまさに、おっしゃる通りでした。
for文の指定で、特別なスカラーを入れて回す特殊な方法なのかと、悩んでいました。
おそらく、"@{$som->parts}"の書き間違えかと思います。
取り出した配列の中身が、ハッシュのリファレンスだったりと、解決後も多少四苦八苦しましたが、
リファレンス=Cのポインタのイメージで追っていったら解決できました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) laravel 本番環境でメールが送れません。 1 2023/02/17 17:57
- Perl Perl の外部モジュールの利用方法 3 2022/07/10 18:34
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- Perl perlの構文でカンマの意味が分からない 2 2022/10/30 01:53
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- 英語 提示文の"on"の意味について(My tablet froze on me again!) 2 2023/06/02 13:10
- 英語 【 英語 forの意味 】 I will buy my watch back for the sum 3 2023/01/02 22:06
- 英語 提示した名言の"be to be able to do"の意味等について 4 2023/05/17 10:02
- 大学・短大 AtCoder ABC 107 D - Median of Medians の中央値の出し方について 2 2022/11/21 17:07
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Can't use string ("0") as an ...
-
サンプルの意味
-
画面を強制的に再描画させる方法
-
perlで2次元配列をサブルーチ...
-
どなたかこのプログラミングを...
-
VBのReturnの使い方
-
VBA for i=1 to lastrow
-
VBAでの一時停止と再開の方法
-
Excel VBA ユーザーフォームの...
-
乱数の桁数指定、または範囲指定。
-
ということですか 他に固定りよ...
-
VBAのautofilter、criteriaの配...
-
Visual BasicのUserFormが閉じ...
-
アセンブラによるウェイト(WAIT...
-
マクロ Publicでの配列定義
-
ListBox 複数選択 で オートフ...
-
UWSCの終了の仕方
-
Perlは戻り値で、ハッシュや配...
-
EXCEL VBA(初心者)印刷ルー...
-
C言語でファクト関数を使わずに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Can't use string ("0") as an ...
-
PerlでCSV形式のファイルの一部...
-
perlの引数が不安定になります。
-
perlの比較、ループの使い方に...
-
レキシカル変数について
-
画面を強制的に再描画させる方法
-
VBAでの一時停止と再開の方法
-
データベースでユーザーのパス...
-
VBのReturnの使い方
-
ループ7回目の悪役令嬢は、元敵...
-
UWSCの終了の仕方
-
Escキーを押すと、中断する時と...
-
エクセルの当番表を作っていま...
-
GIFアニメをループさせたくない
-
VBAで3秒だけ時間を止めたい
-
どなたかこのプログラミングを...
-
VBA for i=1 to lastrow
-
文字列を変数名として扱う方法
-
ハッシュ検索はなぜ速い
-
DOSコマンドのループ内のTIMEコ...
おすすめ情報