• ベストアンサー

perlのプログラミングについて

perlのプログラミングについて詳しい解説をお願いいたします。 sub list_reverce{ my $old=shift; my&new=undef; while (my $cur=$old){ $old=$old‐>[NEXT]; $cur‐>[NEXT]=$new; } return $new } 全くの初心者です。連結リストに対してのreverseなのですが、わかりません。 ご回答お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

このプログラムは、おそらく期待通りの動きをしません。 ここに書かれた通りならプログラムが間違っています。あなたが入力したのなら、入力間違いしていると思われます。 使われている命令自体は、Perlの基礎です。 なので、個々の命令については理解はできているものとして、解説はしません。 「連結リスト」という、データ構造は理解できてますか? それを、このプログラムではどうやって実現させてますか?ハッシュ?クラス?リスト(データ構造としての連結リストではなく、Perlの機能としての)? $old = A→B→C→D→undef(終端判別用) となっているリストを $new = D→C→B→A→undef にして、$newを返す、というのが期待される動作だと思われます。 ここで「→」は A->NEXT = B となっていることを表現しています。 my&new=undef; は my $new=undef; の間違いでは。 連結リストにハッシュが使われているなら {'NEXT'} 等と{}を使います。 リストが使われているなら、どこかで use constant NEXT=>1 などとNEXTに値を設定しているはずです。 どちらが正しいか、あるいは、これ以外なのか、確認してください。 動作がわからないなら、コンピュータになったつもりで、自分で実際に実行してみましょう。 ・初期状態 undef($new) A($old)→B→C→D→undef ・whileループ A($cur,$old)→B→C→D→undef ・$oldを次の位置へ A($cur)→B($old)→C→D→undef ・$curの矢印を$newへ変更 undef($new)←A($cur) / B($old)→C→D→undef ・$newを変更: これが提示されてるプログラムに抜けている undef←A($cur, $new) / B($old)→C→D→undef ・whileの次のループ undef←A($new) / B($cur, $old)→C→D→undef ・$oldを次の位置へ undef←A($new) / B($cur)→C($old)→D→undef ・$curの矢印を$newへ変更 undef←A($new) ← B($cur) / C($old)→D→undef ・$newを変更 undef←A ← B($cur, $new) / C($old)→D→undef 以下同様。最終的に undef←A ← B← C ←D($new) / undef($cur, $new) でwhileの条件が偽→終了

すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.2

## 私も初心者でここでお世話になっていますので恩返しです。 ## 私のわかる範囲で書いてみました。参考になれば幸いです。 sub list_reverce{ ##サブルーチンの名称は list_reverce だよ、と言う意味 my $old=shift; ## 変数$oldをmy で宣言するとともに 引数からshift関数で代入している my&new=undef; ## なぞ? my $new=undef;のタイプミス(typoという)か?ならば変数$newを宣言し未定義値undefを代入し明示的に未定義にしている while (my $cur=$old){ ## $curが$oldの間処理を繰り返す $old=$old‐>[NEXT]; ## 先ほどのshiftした引数はリファレンスなのですね、そのリファレンスをデリファレンスした配列のNEXT番目を$oldに代入 $cur‐>[NEXT]=$new; ## $newを$curをデリファレンスした配列のNEXT番目に$newを代入 } return $new ## $newが戻り値 } ## 全体を見ないと[NEXT]と言うのがよくわかりません。 ## 以上私のわかる範囲で書いてみました。

すると、全ての回答が全文表示されます。

関連するQ&A