

下記のようなソースコードを書いたところエラーが出てしまいました。
$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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フォームを再送信しますか?
-
ChatGPT
-
チェックボックスでのvalue値の...
-
ChatGPTの性能は昔に比べて上が...
-
apacheでPerl CGIが作動せず、5...
-
エクセルで集計したい。
-
chatGPTみたいに画像生成出来る...
-
iDeCo
-
皆さんはGUCCIはハイブランドだ...
-
cgi-binのエラー?
-
Trees掲示板CGI(CGI-Resque氏...
-
めちゃきれい
-
number 改行が追加できない
-
生成AI画像について
-
3DCG
-
ホームページにメールフォーム...
-
cgi アクセス制限 エラー
-
CGIの記述について教えてくださ...
-
CGIの設置が分かりません・・・
-
ホームページにCGIを設置したの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBのReturnの使い方
-
サブルーチン(共通の処理)の...
-
Perl実行時のメモリ不足について
-
サブルーチンの使い方
-
RFC822形式の日付を生成するサ...
-
Perlの関数の引数について詳細
-
ExcelVBAでのデータ型変換、も...
-
定数についての質問です
-
yychatのcokkie機能がおかしく...
-
画面を強制的に再描画させる方法
-
UWSCの終了の仕方
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
VBAでの一時停止と再開の方法
-
Escキーを押すと、中断する時と...
-
乱数の桁数指定、または範囲指定。
-
イベントの発生を待つ
-
C言語について。
-
流れ図(フローチャート)が分か...
-
UWSCに制限時間を付けたいです
おすすめ情報