LISPでperlのforeachを使って配列の要素を表示する方法と配列のサイズを求める方法

このQ&Aのポイント
  • LISPではperlのforeachを使って配列の要素を表示する方法はどのようになるのでしょうか?また、配列のサイズを求める方法も知りたいです。
  • LISPでの配列のひとつひとつの要素を表示させる方法や、配列のサイズを求める方法について教えてください。
  • LISPでperlのforeachを使って配列の要素を表示する方法と、配列のサイズを求める方法を教えてください。
回答を見る
  • ベストアンサー

LISPではperlのforeachをどのように書くのでしょうか?

LISPでの以下の配列の配列、(LISPでは何て呼ぶのかな?)の ひとつひとつの要素を表示させたいです。 (setq dat'( ( 1 2 3 4 5) ( 6 7 8 9 10) (11 12 13 14 15) ) ) LISPではperlのforeachをどのように書くのでしょうか? # Perlの場合 foreach(@pos){ foreach($_){ print "$_\n"; } } また、配列のサイズ今回の場合は1次元配列では3,2次元配列ではサイズが5ですが、LISPで配列のサイズを求める方法も知りたいです。

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

  • ベストアンサー
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

Common Lispであれば、perlのforeachに相当するのはdolistというやつです。リストの長さを返すのは、length ただ、リストの操作はdolistを使うよりも、car,cdrを使って再帰を使うほうがLispぽい気はしますが。

関連するQ&A

  • Perlで早いプログラムを作りたい

    perlの初心者です。 一つの配列の構成要素が100~1000のものが1000個ほどあります。 ある配列の一つの要素が他の配列に何個づつあるかを調べています。 作ったプログラムは次の三つですがとても遅く、もっと早い方法があれば 教えてください。 1.foreach $a(@hairetsu1){     $n=0;     foreach $b(@hairetsu2){       $n++ if $a =~ $b;     }   } 2. foreach $a(@hairetsu1){     $n=grep(/$a/,@hairetsu2);  } 3. for($i=0;$i<length(@hairetsu1);$i++){    $n=0;    for($j=0;$j<length(@hairetsu2);$j++)      $n++ if $hairetsu1($i) =~ $hairetsu2($j);    }  } 上が一番早く下に行くほど遅いですがあまり違いはありません。 よろしくお願いします。

  • perlでの三次元配列の作り方

    perlで三次元配列をテキスト入力から作りたいのですが、例えば二次元配列の場合 foreach $line (@input) push @data, [split /[:]/, $line]; で@dataが二次元配列になるのですが、三次元配列の場合このあとに push @output, \@data; とするとリファレンスが同じであるためループをまわしてもうまく三次元になりませんよね。 解決法はありますでしょうか?

  • foreachで多次元配列を生成

    こんにちわ。 配列をforeachでループさせて、それを多次元配列に入れていくことは可能でしょ うか? 例えば以下のようなデータがあるとします。 ---meibo.dat-------- c21<>田中<>21<>東京 c22<>佐藤<>22<>大阪 -------------------- ---test.php----------------------------------------------------- <? $list_meibo = file("meibo.dat"); foreach($list_meibo as $temp){    $i=split("<>",$temp);    $a=array($i[0] => array("name"=>$i[1],"age"=>$i[2],"ad"=>$i[3]),); } ?> ------------------------------------------------------------------- これでは $a=array("c21"=>array("name"=>"田中","age"=>"21","ad"=>"東京"), "c22"=>array("name"=>"佐藤",age"=>"21","ad"=>"大阪"),); という具合になってくれないでしょうか? これでいくと、配列の最後の要素のみデータに残ります。 どのようにしたらよいでしょうか? ご教授お願いします。

    • ベストアンサー
    • PHP
  • foreachについて

    下記の配列についてitem2の値のみ取り出したいのですが、 foreach($food as $key1=>$array){ foreach($array as $key2=>$array2){ echo $food["$key1"]["item2"]; } } foreachで回して取り出すと555444333となります。 543という結果が欲しいのですが、 実際には下記の配列が数百と大量にあり、一次元配列の数字は下記のように0から1ずつ増えていきます。(二次元目のキーは全てitem0~item2となっています) キーの変更をしないでitem2の値のみ一度に取り出すにはどうしたらよいのでしょうか? (取り出す前に配列の削除などのプログラムもあるため、0から順番に並んでいるとは限りません。 ) $food["0"]["item0"]="y"; $food["0"]["item1"]="bi"; $food["0"]["item2"]="5"; $food["1"]["item0"]="y"; $food["1"]["item1"]="dou"; $food["1"]["item2"]="4"; $food["2"]["item0"]="n"; $food["2"]["item1"]="co"; $food["2"]["item2"]="3";

    • ベストアンサー
    • PHP
  • Perlでのforeach文の挙動がわかりません

    Perlに詳しい方教えてください。 WinXP(SP3)+ActivePerl-5.10.0.1004の環境で、重複データのチェックプログラムを 作成していますが、foreach文の挙動がよく分かりませんので教えてください。 ※Perlは独学です。 <入力ファイル> あいうえお あいうえお かきくけこ あいうえお <出力期待値その1> あいうえお,重複しています あいうえお,重複しています かきくけこ あいうえお,重複しています <出力期待値その2> あいうえお,重複しています あいうえお,重複しています かきくけこ あいうえお <プログラムの要約> open(IN,$input_file); # 入力ファイルを読み込み @BASE = <IN>; close(IN); @BASE_2 = @BASE ; # 配列のコピーを作成 $count_1 = '0' ; foreach $data_1 (@BASE) {   $count_1++ ; # 何行目を処理しているかのカウンター   $flag_1 = '0' ; # フラグの初期化   $count_2 = '0' ;   foreach $data_2 (@BASE) { # ←★ここの記述方法の質問です★     $count_2++ ;     if ( $count_1 == $count_2 ) { next; } # 自分自身の行とは比較しない     if ( $data_1 eq $data_2 ) { $flag_1 = '1' ; } # 一致したらフラグを立てる   }      if ( $flag_1 == '0' ) { # フラグが立たなかったらそのまま新しい配列へ追加     push(@kekka,$data_1);   } else { # フラグが立ったらコメントを追加して新しい配列へ     $data_1 =~ s/\n//g;     $data_3 = $data_1 . ",重複しています\n" ;     push(@kekka,$data_3);   } } $kekka_2 = join("",@kekka) ; # 配列のデリミタ対策 open(OUT,"> $output_file"); print OUT "$kekka_2"; close(OUT); exit; <質問> 上記プログラムの★マークの箇所で、 foreach $data_2 (@BASE_2) としますと、<出力期待値その1>が得られます そして、 foreach $data_2 (@BASE) としますと、<出力期待値その2>が得られます プログラムの途中で @BASE_2 = @BASE としていますので、一見しますと 同じ処理をしているように感じるのですけれども、実際には出力結果が異なり ますので、何かが違うのだと思います。 その違いを教えて戴きたいです。 ※投稿確認画面でTABが消えてしまいますのでTABは全角スペースに変更して  おります。  見えづらい場合には申し訳ありません

    • ベストアンサー
    • Perl
  • 連想配列とforeach

    連想配列 %hogeにおいて、.name の名前が最後に付く配列の値を取り出したいと思い、下記のようにしました。 foreach ($hoge{/.*\.name$/}) {  print "$_\n"; } としてみましたが期待した出力がされませんでした。こういう描き方って出来ないんでしょうか?それともどこか間違ってますか?

    • ベストアンサー
    • Perl
  • perl初心者です。わかる方お願いします。

    DNA情報の解析でDNAに含まれる各塩基の数をカウントするperlプログラムを作りたいのですが、やり方が分りません。以下のような配列があったとして、 ATGCATGCATGCATGCATGCATGCAT このとき、A 7,T 7,G 6,C 6と出力されるようにしたいです。 次のようなperlを作ってみたのですが、 my(@bases, %count, $base); @bases = <>; foreach $base (@bases){ $count{$base} += 1; } foreach $base (keys %count){ print "$base $count{$base}.\n"; } この場合、@basesに入るのは元の1文なので上手く動かないと思うので、元の1文を1文字ずつ行に入れるといけると思うのですが、やり方がわからなくて困ってます。 助けてください。

    • ベストアンサー
    • Perl
  • foreachについて

    phpを今勉強中なのですがforeachで少し分からない部分があります。 例えば(1)はnのある配列を消去するだけのプログラムでして、これを (2)のように書き換えてみると、全て表示されてしまい、(1)と同じ動きをしません。 phpマニュアルを読む限り同じ動きをすると思うのですが、array_keys($key1)の中に うまく一時配列のキーが入っていないように思います。 どうしてでしょうか? (1) <?php $food["y"]["bb"]= "k1"; $food["n"]["bb"]= "k2"; $food["n"]["cc"]= "k3"; $food["k"]["dd"]= "k4"; foreach($food as $key=>$key1){ foreach($key1 as $key2=>$key3){ if($key=="n") unset($food[$key][$key2]); } } echo "<pre>"; print_r($food); echo "</pre>"; ?> (2) <?php $food["y"]["bb"]= "k1"; $food["n"]["bb"]= "k2"; $food["n"]["cc"]= "k3"; $food["k"]["dd"]= "k4"; foreach($food as $key=>$key1){ foreach($key1 as $key2=>$key3){ if(in_array("n",array_keys($key1))) unset($food[$key][$key2]); } } echo "<pre>"; print_r($food); echo "</pre>"; ?>

    • ベストアンサー
    • PHP
  • foreach内での$_の書き換え

    数年前にハッシュのデータをforeachで取り出す時、$_をいじると、$_はハッシュのデータと直接つながっているので、ハッシュのデータ(keyは変わらずvalueのほう)が書き換わってしまうと聞き、実際にやってみて書き換わってしまった覚えがあります。 %hash = ("red" => "aka", "green" => "midori", "blue" => "ao", "black" => "kuro"); foreach (%hash){ print "$_<br>\n"; $_ = "modify"; } print "<hr>\n"; foreach (values %hash ){ print "$_<br>\n"; } ↓↓↓↓↓↓html↓↓↓↓↓↓↓ blue ao green midori red aka black kuro ------------------------------------ modify modify modify modify ↑となったはず 先日それを試してみたら書き換わりませんでした。 以前は確かに書き換わった覚えがあります。 perlの仕様が変わったのでしょうか。それとも私が何か間違っているのでしょうか。 詳しい方にお教えいただければと質問しました。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 複数の配列からfor構文の中で任意の要素を表示させる

    @dat1=(12,11,16,17); @dat2=(21,26,23,20); ・・・ @dat17=(22,34,31,18); for($i=1;$i<=$17;$i++){ print @{"dat$i"};print "\n"; } といったように,@dat1から@dat17まで配列が用意されているときに上の例では当然ながら@dat1全ての要素が表示されます。これを任意の要素のみを表示させたい場合にはどのようにすればよいでしょうか? 例えば@dat1から@dat17までの0番目の要素($dat1~17[0])と1番目の要素($dat1~17[1])のみを表示させたいのですが...

    • ベストアンサー
    • Perl