電子書籍の厳選無料作品が豊富!

perlのプログラミングについて詳しい解説をお願いいたします。

sub list_reverce{
my $old=shift;
my&new=undef;

while (my $cur=$old){
$old=$old‐>[NEXT];
$cur‐>[NEXT]=$new;
}
return $new
}

全くの初心者です。連結リストに対してのreverseなのですが、わかりません。
ご回答お願いいたします。

A 回答 (2件)

このプログラムは、おそらく期待通りの動きをしません。


ここに書かれた通りならプログラムが間違っています。あなたが入力したのなら、入力間違いしていると思われます。

使われている命令自体は、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の条件が偽→終了
    • good
    • 0

## 私も初心者でここでお世話になっていますので恩返しです。


## 私のわかる範囲で書いてみました。参考になれば幸いです。

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]と言うのがよくわかりません。
## 以上私のわかる範囲で書いてみました。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!