匿名質問者

perlのプログラムが誤作動します。

forで配列を読み取っている時に配列を一つ追加したいのですが誤作動します。
一方は成功し一方は失敗します。内部でどう動いているのでしょうか?また、良いコードはありますか?


my @array = (1,2,4,5);
for(@array){
if(m/2/){
# @array = (@array,3);
push (@array,3);
}
print ; # 12453と表示される
}

exit;

#こちらは無限ループになる。本当にやりたいのはこちら。
my @array = (1,2,4,5);
for(@array){
if(m/2/){
# @array = (3,@array);
unshift (@array,3);
}
print ; # 12345と表示させたい
}

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2017/10/01 21:53:36

ベストアンサー

匿名回答1号 No.1

unshift関数 - 配列/リスト - Perl関数のリファレンス

unshift(ARRAY, LIST)

配列の先頭にリストを追加します。

パラメータ:
ARRAY 対象の配列
LIST 追加するリスト
戻り値:
リストを追加後の配列の要素数

要素数をarrayに代入しちゃダメでしょう。

匿名質問者

あ、すみません。
他の方式を書いた物が残っていました。修正しました。

ただ、配列の先頭へ入れてしまうため、いずれにしてもこれではダメですね。

2017/10/01 21:53:22

その他の回答0件)

匿名回答1号 No.1

ここでベストアンサー

unshift関数 - 配列/リスト - Perl関数のリファレンス

unshift(ARRAY, LIST)

配列の先頭にリストを追加します。

パラメータ:
ARRAY 対象の配列
LIST 追加するリスト
戻り値:
リストを追加後の配列の要素数

要素数をarrayに代入しちゃダメでしょう。

匿名質問者

あ、すみません。
他の方式を書いた物が残っていました。修正しました。

ただ、配列の先頭へ入れてしまうため、いずれにしてもこれではダメですね。

2017/10/01 21:53:22
匿名質問者

質問者から

匿名質問者2017/10/01 21:51:58

質問文を編集しました。詳細はこちら

  • 匿名回答2号
    匿名回答2号 2017/10/02 17:19:07
    あほちゃうか
  • 匿名回答3号
    匿名回答3号 2017/10/03 12:50:57
    同じ要素の配列をコピーして作って、
    コピーのほうのループでまわせば?
  • 匿名質問者
    匿名質問者 2017/10/03 13:36:19
    コメントありがとうございます。
    例えが悪く済みません。本来は以下のようにするのが理想だと思いますが、コードを付け足しで書いている場合、DoSubを作成することなく、forの中に長いコードがある場合があります。しかもスパゲティ化して蔕に触ると危険場合。そんなときに、エラーが出た時だけもう一度同じ動作を繰り返しをさせたい場合を想定しています。
    勿論、しっかり使う場合であれば、作り直すべきでしょうが、ちょっと使う程度であれば、とりあえず、forで回している@arrayの中間に一個つ配列に加えて処理を増やしたい。こんな状態を想定しています。
    質問文の例の1つめではそんな感じで最後に付け足しています。しかし、できれば、エラーが起きた直後にその処理をさせい感じで考えて居ます。
    @array = (1,2,4,5);
    for(@array){
    $r = &DoSub($_);
    if($r eq "NG"){
    $r = &DoSub($_);
    }
    }
    sub DoSub(){
    #色々な処理
    }

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません