
関数のプロトタイプ宣言と、それに関するwarningsプラグマについてお教えください。
関数のプロトタイプ宣言は、その関数を呼び出す側がコンパイルされる時点で、すでに存在する必要があり、また、use warningsによってプラグマを有効にしておくと、遅いプロトタイプ宣言について警告してくれると理解していました。
以下の2例は、どちらもプロトタイプ宣言が遅いために、うまくプロトタイプが働かない例です。
しかし、(例1)ではwarningが表示されるのに対し、(例2)では表示されません。
どこか私の理解が誤っているのかと思うのですが、このようになる理由についてご教授いただきたく、よろしくお願いいたします。
■ (例1)
#!/usr/bin/env perl
# -*- mode: cperl; coding:utf-8 -*-
use strict;
use warnings;
my @a= 1..4;
mypush( @a, 5..8);
print join( ",", @_), "\n";
sub mypush(@@){
if( @_== 2){
print "ok.\n";
}else{
print "Prototypes does not work, arg. num=", 0+ @_, "\n";
}
}
□(出力1)
main::mypush() called too early to check prototype at ./chk_prototype.pl line 10.
Prototypes does not work, arg. num=8
■(例2)
#!/usr/bin/env perl
# -*- mode: cperl; coding:utf-8 -*-
use strict;
use warnings;
test_2();
exit 0;
sub test_2{
my @a= 1..4;
mypush( @a, 5..8);
print join( ",", @_), "\n";
}
exit 0;
sub mypush(@@){
if( @_== 2){
print "ok.\n";
}else{
print "Prototypes does not work, arg. num=", 0+ @_, "\n";
}
}
□(出力2)
Prototypes does not work, arg. num=8
----
なお、Perlは、
perl -v
This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
を使用しております。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
実際には実行しておりませんので、あまり本気にとらえないで下さい。
sub name(prt)はコンパイラが見るものです。
ブロックは実行中に定義されるものです。
まず書式の順番がおかしいです。
プロトタイプを使うのなら、BEGINするか、useするのが普通です。(使わなくてもします)。
テストの場合は、最低でも冒頭で関数の宣言のみをおこなうべきです。
実行中に未定義の関数が使用された場合、Perlはその場で関数を探し始めます。
これは当然警告が出ます。
プロトタイプが正常に機能してると証明出来るのは、
foo 1, 2;
とカッコを省いて書ける場合です。
これはコンパイラにすでに(組み込み関数と同じように)畳み込まれているためそうなりますし、
またこの記法が通れば処理の順序がおかしくないことの証明となります。
通常は組み込み関数で引数にカッコを使わないのと同様、
(記述がややこしくならない限り)プロトタイプもカッコを使いません。
--------------------
二点目。
プロトタイプ@@は無意味です。
これは
(@araay1, @araay2);
このカッコが何を出力するのが、と言うのと同じ問題です。
プロトタイプ宣言の正しい使い方を知りたいのではなく、
プロトタイプ宣言を誤って使った場合の、usewarningsプラグマの動作について知りたいのです。
サンプルのプログラムのミスのご指摘、ありがとうございました。
今更ではありますが、訂正させていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- CGI -T(汚染モード)でメールが送れません 1 2022/06/12 14:11
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- JavaScript JAVASCRIPT 2 2022/04/15 15:10
- Perl Perl の外部モジュールの利用方法 3 2022/07/10 18:34
- Perl Perlのエラーについてご教授ください。初心者です。 CGIを別サーバに移したところ、Perlのバー 5 2023/05/31 10:48
- その他(プログラミング・Web制作) Pythonのライブラリ、randomについて 3 2022/09/20 14:30
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- その他(プログラミング・Web制作) pythonのmap、結果の利用は1度だけ? 5 2022/06/11 12:33
- TOEFL・TOEIC・英語検定 英語 文法 1 2023/02/27 14:01
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Pythonのプログラミングの質問...
-
Perlの書き方について
-
PerlでCabochaを呼び出すには(...
-
Perlで自分自身の関数名を知る...
-
検索機能の作成で困っています
-
JSONで文字列が長い時
-
Application.ScreenUpdating = ...
-
Excel VBAで行追加後の...
-
【プルダウンで選んでGOボタン...
-
セレクトメニューで2つの項目...
-
文字の横にプルダウンを表示さ...
-
プルダウンメニューがプルアップに
-
16進の10進変換について
-
FindFirst を複数条件で検索
-
Pythonでコンソールをクリアす...
-
セレクトボックスの中を一部隠...
-
複数列を持ったリストボックス...
-
optionのselectedは更新時は効...
-
メールフォームを作成したいの...
-
[python] 文字列を変数名として...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プロトタイプ宣言のワーニング...
-
これは動いてくれますか??
-
Perlで複数の値を返す良い方法...
-
CGIから複数の別プログラムを同...
-
Rubyのgets関数について
-
dieやPerl自体でエラーが発生し...
-
Perl:計算誤差について
-
HASH(0xほげほげ)
-
内部処理形式が日付型 (Date) ...
-
引数の値をURLのパスに配列とし...
-
Perlで足し算をするには
-
Perlで自分自身の関数名を知る...
-
perlでテキスト複数行を関連付...
-
print <<"_HTML_"の中でサブル...
-
なんで?
-
Net::Telnetでタイムアウト時間...
-
foreach 回数制限
-
Pythonのマルチプロセスでの並...
-
JSONで文字列が長い時
-
Application.ScreenUpdating = ...
おすすめ情報