下記のようなソースコードを書いたところエラーが出てしまいました。
$sum = $sample2($a);
の箇所でエラーが起こっているようなのですが、解決の仕方が分かりません。
&sample1(5,'&sample2');
sub sample1 {
($a,$sample2) = @_;
$sum = $sample2($a);
print $sum;
}
sub sample2 {
($a) = @_;
$b = 10;
$sum = $a + $b;
return $sum;
}
このように、サブルーチンの中に更にサブルーチンを書いて、なおかつそのサブルーチン名を一旦変数に格納して使用する場合はどのようにプログラムを書けば良いのでしょうか??
""で囲ったりといろいろとしてもダメでした。
もちろん、$sum = $sample2($a); ではなく $sum = sample2($a); のように書けば良いとは思うのですが、一度サブルーチン名を変数に入れてから使用する場合はどのようにすれば良いのでしょうか??
ご回答の程よろしくお願い致します。
No.4ベストアンサー
- 回答日時:
むしろ最近は関数に&をつけない方が主流なようです。
唯一&を付けるのが、コードリファレンスを作るときです。省略するときは、既に
書かれているようにシンボリックリファレンスを使います。
my $code_ref = \&func2; # コードリファレンスを作る
func1( 5, $code_ref ); # コードリファレンスを渡す
sub func1 {
my ( $var, $code_ref ) = @_;
# コードリファレンスを実体化(デリファレンスという)し
# 元の関数を呼び出す
my $sum = $code_ref->($var);
print $sum, $/;
}
sub func2 {
return $_[0] + 10;
}
No.3
- 回答日時:
以下のようにシンボリックリファレンスを使う方法もありますが、非推奨です。
通常は、No.2さんの回答のようにコードリファレンスを渡します。&sample1(5,'sample2');
sub sample1 {
($a,$sample2) = @_;
$sum = &$sample2($a); # もしくは $sum = $sample2->($a);
print $sum;
}
sub sample2 {
($a) = @_;
$b = 10;
$sum = $a + $b;
return $sum;
}
No.2
- 回答日時:
コードリファレンスを渡すという方法もあります。
func1( 5, \&func2 );
sub func1 {
my ( $var, $code_ref ) = @_;
my $sum = $code_ref->($var);
print $sum, $/;
}
sub func2 {
return $_[0] + 10;
}
この回答への補足
ご回答ありがとうございます。
無事問題解決しました。
こういう風に書くのですね☆
ですが、もう一つ質問させてください。。
コードリファレンスを渡すという方法は、
func1( 5, \&func2 );
のことを言うのでしょうか??
それとも、
my $sum = $code_ref->($var);
のことを言うのでしょうか??
コードリファレンスを調べてみたのですが、うまくヒットせず理解できませんでした。。
あと、サブルーチンは&を省略することができると思うのですが、このコードリファレンスを渡す場合は、&は省略することはできないのでしょうか??
普段、私はサブルーチンを使う場合、分かりやすいので&を書くのでこの書き方で良かったのですが、&を書かない方法もあるのかなぁと少し思いました。
度々で申し訳ありませんが、ご回答頂けると幸いであります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 車検・修理・メンテナンス Vベルト SA形とA形の違い お世話になります、 現在SA-49を使用している機械があります。 ホー 2 2022/05/14 16:12
- 会計ソフト・業務用ソフト ExcelのSUM関数と+の違い 2 2022/07/12 18:32
- 工学 ちなみになぜv=(v・e1)e1+(v・e2)e2はe1やe2が、正規直交基底でないと成り立たないと 2 2022/12/22 17:22
- 雑誌・週刊誌 12月22日頃880円で発売する予定の絶世ワールドクラスvol.9を絶対に手に入れる方法を教えてくだ 1 2022/11/25 16:46
- その他(パソコン・周辺機器) Windows10でXBOX360用RAPVX-SA用の非公式ドライバがインストール出来ない 1 2023/01/10 19:37
- Excel(エクセル) Excel2007での条件付き書式について 6 2023/05/02 10:56
- 工学 以前、線形代数からフーリエ級数展開を導く上で 式v=(v, e1)e1+(v, e2)e2+…+(v 6 2022/06/29 17:24
- その他(データベース) 「1004:アプリケーション定義またはオブジェクト定義のエラー」への解消方法に関して 1 2023/07/09 11:47
- Visual Basic(VBA) 最終列の右へSUM関数を作成するため下記コードを実行しましたが、最終列「10月28日」が上書きされて 3 2022/12/05 20:32
- その他(ホビー) NEXCO中日本のミニカーについて 1 2023/06/11 13:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBのReturnの使い方
-
Perl実行時のメモリ不足について
-
サブルーチン(共通の処理)の...
-
VBA for i=1 to lastrow
-
画面を強制的に再描画させる方法
-
GIFアニメをループさせたくない
-
エクセルの当番表を作っていま...
-
UWSCの終了の仕方
-
短いハッシュの作り方
-
エクセルVBAでTransposeの不思議
-
ExcelVBAで、index、match関数...
-
まったく同じファイルのハッシ...
-
pythonでファイルのコメント行...
-
二次元配列のインデックスについて
-
どなたかこのプログラミングを...
-
VBAのautofilter、criteriaの配...
-
DoEventsが必要な理由について
-
テキストボックスの名前に変数...
-
VBA横データを縦にしたいです
-
vb.netからエクセル関数書き込み
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBのReturnの使い方
-
ExcelVBAでのデータ型変換、も...
-
COBOLの日付操作
-
プロシージャとは
-
RFC822形式の日付を生成するサ...
-
サブルーチン(共通の処理)の...
-
流れ図・・・
-
Perl実行時のメモリ不足について
-
$#{スカラー変数}とは何を意味...
-
Perl・DBIでの汎用selectサブル...
-
${str}と$strの違いとは?
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
「偶数・奇数の和」のフローチ...
おすすめ情報