![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
数年間とりあえず普通に動いている自作のプログラムを眺めていたらおかしな部分を見つけました。これは修正しないでそのまま使えますか?
また、このプログラムを見て疑問に思ったのですが、★の部分、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ランキング
-
foreach 回数制限
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
セレクトメニューで2つの項目...
-
メモリをアドレスを直接指定し...
-
文字の横にプルダウンを表示さ...
-
テーブル内でドロップダウンメ...
-
[Ruby] irbにおける文字化け
-
数値かどうかの判定方法
-
実行時エラー 3020の対策
-
エクセルVBA シート名の部分一...
-
変数名に変数を使用
-
formで特定のinputを送信しない...
-
phpでボタンを押したときに変数...
-
Python - Excel で Webからデー...
-
文字のカラーとフォントの指定...
-
子windowsからsubmit()後にclos...
-
【至急!!!】python言語で本を見...
-
FindFirst を複数条件で検索
-
16進の10進変換について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CLispのloop内の挙動について
-
Perlで自分自身の関数名を知る...
-
Net::Telnetでタイムアウト時間...
-
print <<"_HTML_"の中でサブル...
-
Rubyのgets関数について
-
10進数→2進数
-
CGI初心者です
-
Perlで複数の値を返す良い方法...
-
作業域が消える(ように見える)
-
検索機能の作成で困っています
-
Pythonのマルチプロセスでの並...
-
ハノイの塔の問題で困っており...
-
LISPで連想配列の操作?
-
PERLの「!=」と「=~」 or...
-
PerlでCabochaを呼び出すには(...
-
foreach 回数制限
-
シェルでawkを使い行数を取り出...
-
Wコロン
-
HASH(0xほげほげ)
-
プロトタイプ宣言のワーニング...
おすすめ情報