数年間とりあえず普通に動いている自作のプログラムを眺めていたらおかしな部分を見つけました。これは修正しないでそのまま使えますか?
また、このプログラムを見て疑問に思ったのですが、★の部分、nextとreturnはどちらでもこの場合同じ挙動になりますか?
なお、以下コードをテストして見る限り同じような挙動に見えます。
use strict;
$| = 1;
for(1..50){
print ;
&Test($_);
sleep 1;
}
sub Test(){
my $a = shift @_;
for(1..2){
print ".";
}
if($a % 2 == 0){
print "2";
# next; #★
# return ; #★
}
print "*\n";
}
No.2ベストアンサー
- 回答日時:
通常は使えません。
next は「現在のループを中段して次のループへ移動する」もの
returnは「現在の関数を終了して呼び出し側に戻る」もの
と、動作はまったく違います。
http://perldoc.jp/func/next%20LABEL
> ブロック自身は一回だけ実行されるループと文法的に同一であることに 注意してください。
> 従って、next はそのようなブロックから早く抜けるのに使えます。
とあるので、
next で、 sub(){} のブロック(=1回だけのループ)の次のループに移行する
→ 2回目は無いのでループから抜ける(=sub(){}のブロックから抜ける=subを終了する)
という動作をしていて、見掛け上は subを終了する return と同じに見えるのでしょう。
ですが、
{
if($a % 2 == 0){
print "2";
# next; #★
# return ; #★
}
}
print "*\n";
と、一つブロックを深くすると
next : 一番違いブロックを抜ける: print "*\n"; が実行される
return : subを抜ける : print "*\n"; は実行されない
と違いが出てきます。
また
> next は eval {}, sub {}, do {} のように値を返す ブロックから抜けるのには使えません;
とマニュアルに書いてあります。
今回は値を返さないsubなので影響はありませんが。
回答いただきありがとうございます。
とても、とても勉強になりました!
これは酷い誤作動を招きますね。
逆に今この状態で長年動いているということはこの誤作動でうまく回っている可能性もありますし慎重に修正しようと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 順列をランダムに発生するプログラム 1 2022/11/16 12:16
- その他(プログラミング・Web制作) pythonリストの特定の値を表示htmlで表示できない 2 2022/05/14 05:48
- その他(プログラミング・Web制作) 【Python初学者】以下コードについて教えていただきたいです 4 2023/04/19 13:01
- その他(プログラミング・Web制作) pythonのmap、結果の利用は1度だけ? 5 2022/06/11 12:33
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- C言語・C++・C# C言語 leetcode21 Merge Two Sorted Lists 2 2022/04/24 19:35
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- その他(プログラミング・Web制作) listへのappendが出来ない件 1 2022/12/06 21:44
- Ruby パイソンプログラミング 2 2022/12/03 18:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Pythonのプログラミングの質問...
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
formで特定のinputを送信しない...
-
どちのほうがすきですか?
-
パイソンのクラスについて
-
デ-タテ-ブルの内容での更新...
-
セレクトボックスのselected属...
-
16進の10進変換について
-
パイソンプログラミング
-
パイソンのクラスのブログラム
-
【メモリ不足で落ちる(python)】
-
【至急!!!】python言語で本を見...
-
パイソンのクラスについて
-
テーブル内でドロップダウンメ...
-
Pythonでターミナルに文字を出...
-
文字の横にプルダウンを表示さ...
-
実行中の変数の中身をイミディ...
-
文字のカラーとフォントの指定...
-
結果を得て自動的にページ移動...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlで複数の値を返す良い方法...
-
HASH(0xほげほげ)
-
プロトタイプ宣言のワーニング...
-
Pythonのプログラミングの質問...
-
Net::SSH::Perlについて
-
perlのスクリプトどこが間違っ...
-
print <<"_HTML_"の中でサブル...
-
内部処理形式が日付型 (Date) ...
-
Perlで use strict して our変数
-
変数に値を代入するのに、まずu...
-
Perlで足し算をするには
-
連想配列とforeach
-
Perl:計算誤差について
-
icmp socket error
-
Perlで自分自身の関数名を知る...
-
PERLの「!=」と「=~」 or...
-
[perl] next と return 同じ意...
-
for文の中でのforeachの問題
-
PerlでCabochaを呼び出すには(...
-
Net::Telnetでタイムアウト時間...
おすすめ情報