ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:配列の操作について) Perl初心者による配列操作の問題 2009/12/02 20:03 このQ&Aのポイント Perl初心者が配列の操作について壁に当たっている。以下のテキストを整形したいが、<作者>の連続を同上★に変える方法がわからない。参考スクリプトの例や良い書き方があれば教えてほしい。 配列の操作について Perl初心者なのですが、壁に当たってしまいました。 <種類> シングル <解説> あいうえおかきけこさしすせそ <曲例> 千年メダル <作者> ハイロウズ <曲例> 人にやさしく <作者> ブルーハーツ <曲例> ニューグランドホテル <作者> 矢沢永吉 <曲例> 夏の終り <作者> 矢沢永吉 <曲例> FLASH IN JAPAN <作者> 矢沢永吉 <曲例> STAY <作者> 氷室京介 <曲例> 旅人 <作者> ブルーハーツ <種類> アルバム <解説> たちつてとなにぬねのはひふへほまみむ <曲例> DUG OUT <作者> ブルーハーツ <曲例> グレイゾーン <作者> ライムスター <曲例> HEAT ISLAND <作者> ライムスター <曲例> ウワサの真相 <作者> ライムスター <曲例> 僕の話 <作者> スキマスイッチ <曲例> 深海 <作者> Mr.Children <曲例> ケツノポリス2 <作者> ケツメイシ <曲例> ケツノポリス6 <作者> ケツメイシ <曲例> 音樂ノススメ <作者> ハルカリ 上記のテキストを <種類> シングル <解説> あいうえおかきけこさしすせそ <曲例> 千年メダル <作者> ハイロウズ <曲例> 人にやさしく <作者> ブルーハーツ <曲例> ニューグランドホテル <作者> 矢沢永吉 <曲例> 夏の終り <作者> 同上★ <曲例> FLASH IN JAPAN <作者> 同上★ <曲例> STAY <作者> 氷室京介 <曲例> 旅人 <作者> ブルーハーツ <種類> アルバム <解説> たちつてとなにぬねのはひふへほまみむ <曲例> DUG OUT <作者> ブルーハーツ <曲例> グレイゾーン <作者> ライムスター <曲例> HEAT ISLAND <作者> 同上★ <曲例> ウワサの真相 <作者> 同上★ <曲例> 僕の話 <作者> スキマスイッチ <曲例> 深海 <作者> Mr.Children <曲例> ケツノポリス2 <作者> 同上★ <曲例> ケツノポリス6 <作者> 同上★ <曲例> 音樂ノススメ <作者> ハルカリ といったように、 連続している<作者>を同上★に変えたいのですが、 配列?とかもよくわからなくて、 よい参考スクリプトの例があったらと、切に感じております。 なにか良い書き方がありましたら、勉強させてください。 よろしくお願いいたします。 質問の原文を閉じる 質問の原文を表示する みんなの回答 (1) 専門家の回答 質問者が選んだベストアンサー ベストアンサー osamuy ベストアンサー率42% (1231/2878) 2009/12/02 21:11 回答No.1 > 連続している<作者>を同上★に変えたい というのだったら、直前に出現した<作者>の行を変数(例えば変数名$prev_composer)に記憶しておき、一致したら同上★を出力すればよいかと。こんな感じ: my $prev_composer = ''; while ( <> ){ if ( /^<作者>/ ){ if ( $prev_composer eq $_ ){ $_ = "<作者> 同上★\n"; } else { $prev_composer = $_; } } print; } 文字コードや改行コードについては適宜お使いの環境に読み換えてください。 画像を拡大する 質問者 お礼 2009/12/03 11:57 早速の回答ありがとうございました。 おかげさまで変数の宣言・格納など、 未熟ながら調べて理解することができました。 あいまいだった部分も、すっきりできました。 本当にありがとうございました。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発Perl 関連するQ&A 最近の中高校生にも、尾崎豊の歌は心に響くのでしょうか? 最近の中高生のみなさんへの質問です。最近若い世代の方々と音楽の趣味に世代ギャップを感じている30代です。 みなさんのお父さんお母さん世代にカリスマ的人気を誇った尾崎豊というアーティストがいたのですが、尾崎の 歌は今の中高生の心にもちゃんと響きますか? 尾崎は『I Love You』や『15の夜』などが代表曲なのですが、『I Love You』に関しては1、2年前に 宇多田ヒカルがカヴァーをしたこともありました。『15の夜』は「盗んだバイクで走り出す~♪」の歌詞が、 私たちの世代の心に深く響きます。 カラオケで中高生や大学生などの前で尾崎の歌を歌って、ちゃんと盛り上がってくれるだろうかと疑問に思って、 質問しました。また、ブルーハーツの『リンダリンダ』や、永ちゃんこと矢沢永吉の曲でも、いい曲だなぁと思ってくれるでしょうか。 尾崎、ブルーハーツ、そしてYAZAWAを知らない方も多いかもしれませんが、回答いただければうれしく思います。 自然に人が集まってくる人気者(カリスマ)について BOOWYのデビュー前のストーリーを見ていたのですが、ボーカルの氷室京介さんについて、小学生の頃から「いつでも周囲に人を集めてしまう不思議な魅力があった」とありました。 また、売れてからのインタビューで「星というものを信じていて、なぜか小さい頃から俺はスターになるんだと分かっていた」という風に言っていたのですが、 それで思い出したのですが、漢の高祖(劉邦)は、 「若い頃は農業はやらず酒と女が大好きで遊びほうける若者であった。しかし劉邦には不思議な魅力があり、彼がいると人が集まってくるようなカリスマ的な存在であった」 とあり、劉邦がいると客が来るので酒屋が代金をとらなかった、という話があります。 =================================== そこで質問ですが、 間違いなく、人には生まれつきの「スター性」「人気者の資質」というものはあると思いますが、そういう人(いわゆるカリスマ)はどういうところが人を惹きつけるんでしょうか? たとえばアドルフ・ヒトラーは演説の天才と言われていましたし、クリントン大統領や小泉首相は見た目が恰好良いのでTV受けするのは分かりますが、彼らほどではないにしても、例えばパーティ会場などで「自然に人を集めてしまう」という人は確かにいます。 そういう人は、やっぱり本人も人を集めるのを楽しんでいる部分があるんでしょうか? また、そういう才能はほとんど先天的な部分によるんでしょうか? 最後に、最近の有名人では、「生まれながらのカリスマ」と思えるような人はどんな人がいますでしょうか?(コネなどでなく、自然に人が集まってしまう求心力のあるような人) 歌手でいうと北島三郎さん、矢沢永吉さん、氷室京介さんが思いつくのですが、最近の若い人などいましたらお願いします。 80年代の日本のロックと言えば 最近、80年代の「古き良き時代」を振り返ることが多いです。 と言っても沢山ありすぎて、思い出すにも限度があります(笑) 80年代を彩った「日本のロック」を聞き漁りたいという気持ちが 最近とても強いのです。 そこで何か参考になるようなURLがあれば教えていただきたいと思います。 好き嫌いは別にして、パッと思い浮かべてみたら↓の人たちが出てきました。 矢沢永吉、サザン、チャゲアス、レベッカ、BOOWY、ARB ブルーハーツ、BUCK-TICK、尾崎豊、ユニコーン、シナロケ YMO、RCサクセション、バービーボーイズ、浜田省吾 エックス、ルースターズ... 人によって「ロック」の概念は違うとは思いますが、 「↑の人たちを入れるなら、この人も入れないと駄目でしょ」 「80年代の日本のロックといえば、この人は外せないでしょ」 という人たちでしたら、是非紹介して頂きたいと思います。 音楽との新たな出会いがあれば嬉しいし、 キリが無いので(苦笑)最終的に[厳選]したものをCDにしてベスト盤を作ろうかと思ってます。 あまり選択肢が膨らみすぎるのも考えものなので、良いURLがあれば嬉しいです。 配列操作 お世話になっております。適切なタイトルが分からず、漠然と「配列操作」となっていることをお詫びいたします。 ところで、アドバイス頂きたい内容とは、長文のテキストから、単語単位、かつその出現回数を配列にまとめたものがあります。 こんな感じ print_r($result);とすると、 Array ( [対策] => 61 [クランク] => 32 [表示] => 25 [て] => 24 [サイト] => 24 [運営] => 21 [テクニック] => 18 [ため] => 15 [徹底] => 14 ) また、別のテキストから同じように単語単位、出現回数を配列にまとめた$result2というものがあるのですが、そもそも別のテキストを分析?したものなので単語も出現回数もバラバラです。 $result2 Array ( [教えて] => 61 [PHP] => 32 [運営] => 25 [CGI] => 24 [html] => 24 [桜] => 21 [表示] => 18 [PEAR] => 15 [http] => 14 ) そこで、今回質問したいのは、最初の配列をそのまま出現頻度の多い順に表示させ、その横に$result2を表示させたいのですが、内容を比較したく同じ単語のみ以下のように表示させたいのですが思うような結果を得られずにいる次第です。 お忙しい中恐縮ですが、アドバイスのほど頂戴できれば幸いです。宜しくお願いいたします。 上の配列を例にしています。 対策61 クランク32 表示25 表示18 て24 サイト24 運営21 運営25 テクニック18 ため15 徹底14 配列操作について お世話になります。 $obj = array(1 array(id=>111 name=>aaa date=yyyymmdd array(2 array(id=>222 name=>bbb date=yyyymmdd 上記のようなオブジェクト($obj)があるとして この最下層の連想配列データ(id,name,date)を 配列にしたい時は、以下のような書き方で取れると 思いますが、もっとすっきりさせる書き方などありますか? $a = array(); $c = count($obj); for($i=0; $i<$c; $i++){ $a = $obj[$i]['id']; $a = $obj[$i]['name']; $a = $obj[$i]['date']; $i++} 配列操作 SQLで取得した配列データを新たな配列に作り直したいのですがやり方がわかりません。おしえてください。 取得される配列例です。 $Array[i][日付][タイプ][個数][タイプ別レコード数] ↓ $Array[0][0901][1][3][2] $Array[1][0901][2][4][2] $Array[2][0901][3][5][2] $Array[3][0902][1][5][2] $Array[4][0902][2][10][2] $Array[5][0902][3][7][2] この配列を日付が同じものだけ1レコードに作りなおしたいのですがどのようにすればいいでしょうか。 期待する配列例 $Table[i][日付][タイプ1個数][タイプ2個数][タイプ3個数][レコード数] ↓ $Table[0][0901][3][4][5][6] $Table[1][0902][5][10][7][6] よろしくお願いします。 配列の操作について 配列に [100,200,200,100,50] というデータが入っていた場合, 3という結果を取得したいのですが, ※3とは配列より,100,200,50の個数 また,配列のデータは毎回設定が変更されます。 配列に [100,300,300,100,100] →2 このような場合,どのようにしたら良いのでしょうか? VBというよりはアルゴリズムの問題かもしれませんが, よろしくお願いします。 たくさんの配列を簡単に操作したい。 配列の要素を出力したいのですが、 @name_1 @name_2 @name_3 @name_4 print "@name_1\n@name_2\n@name_3\n@name_4\n"; としてるのですが、配列が100個あったとき書ききれません。 このような処理を簡単に書ける方法はないでしょうか? ニュアンスとしては以下のような感じです。 for($n=0;$n<100;$n++){ print "@name_$n\n"; } ご教授おねがいします。 配列操作 エクセルのように A列は降順 B列は昇順 のような並べ替えをしたいのです ちなみに Arr[0]=({key1 : 5 , key2 : 50 , key3 : "あいう"}) Arr[1]=({key1 : 4 , key2 : 60 , key3 : "えおか"}) Arr[2]=({key1 : 5 , key2 : 70 , key3 : "きくけ"}) Arr[3]=({key1 : 4 , key2 : 80 , key3 : "こさし"}) Arr[4]=({key1 : 3 , key2 : 50 , key3 : "すせそ"}) Arr[5]=({key1 : 2 , key2 : 60 , key3 : "たちつ"}) Arr[6]=({key1 : 5 , key2 : 60 , key3 : "こさし"}) Arr[7]=({key1 : 4 , key2 : 30 , key3 : "すせそ"}) Arr[8]=({key1 : 2 , key2 : 30 , key3 : "たちつ"}) となっているものを key1に関して降順 key2に関して昇順 としたいのです 自分がやったこととして Arr.sortOn("key1" , 18) Arr.sortOn("key2" , 16) と順番に書きました その結果 Arr.sortOn("key2" , 16) には なっているのですが Arr.sortOn("key1" , 18) は 全く無視される状態でした 解決策はありませんか? 配列操作 Array ( [0] => Array ( [Category] => Array ( [cate_id] => 1 [category_name] => AAA ) ) [1] => Array ( [Category] => Array ( [cate_id] => 2 [category_name] => BBB ) ) ) 上記、配列で[Category]の部分のみ(0、1共に)を削除したいのですが、どのようにすればよろしいでしょうか? 配列の操作に関して perlプログラミング初心者です。 質問なのですが、ある配列array1に関して foreach(@array1){ ・・・・・・ } という操作をしています。この操作を@arrray2,@array3,@array4に関して、ループを使って行いたいのですがどのようにすればよいのでしょうか。配列の配列を作って @Array = qw/ @array1 @array2 @array3 @array4/; として foreach構文を使うと、@array1が展開されずに処理できませんし・・ 初歩的なことだと思いますがアドバイスお願いします。 連想配列の操作がうまくいかない チェックがついてきたものは"or"ついていなかったものは"and"を返すphpを作成しています。 if($_POST["cb"]) { //チェックされていれば $cb = $_POST["cb"]; //変数 $cb に格納 } $ands = array_fill(0,8,"or"): foreach($ands as $and){ //・・・・・・・・・・・・・・(A) if($cb){ $and="or"; } } echo <<< EOT <form method="POST" action="./checkbox.php"> <input type="checkbox" name="cb[0]">title0<br> : <input type="checkbox" name="cb[8]">title8<br> <input type="submit" value="送信"> </form> EOT; たとえば0,1,4,6にチェックがついていたら、 $and=("or","or","and","or","and","or","and","and") 1.7にチェックがついていたら $and=("or","and","or","or","or","or","and","or) となるように考えたのですが、なぜか(A)の部分にシンタックスエラーが出てきます。 どなたか解決方法をご教示ください。どうかよろしくお願いします。 配列の値の操作について教えてください num.datの内容が 100 200 300 400 500 の時、以下を実行すると open(IN, "./num.dat"); @number = <IN>; close (IN); $number[0] = $number[0] - 10; open(OUT, ">./num.dat"); print OUT @number; close(OUT); 書き出されたnum.datの内容は 90200 300 400 500 のようになってしまいます。これを 90 200 300 400 500 にしたいのですがどうすればよろしいのでしょうか?くだらない質問ですが、何卒ご教授の程よろしくお願い致します。 ファイル操作と配列について Java言語で,テキストデータを読み込み,それを配列に格納したいのですが, どうすればいいのでしょうか? 配列に格納するときに,うまい具合にfor文などで一気に格納したいです。 バイナリファイルの操作(配列の操作について) こんにちは。 大変お世話になっております。 配列要素の先頭[0]から[5]までを文字列N、[6]から[1029]までをバイナリデータの計1030バイトの配列要素を使用しています。 [現在行なっている操作方法] 1. Buf[1500]とBuff[1500]を用意 2. fread関数により、Bufに1024バイトずつ格納 3. sprintf関数により、Buffの先頭[0]から[5]まで文字列挿入 4. strcat関数により、BuffとBufを結合 と言う形をとっています。 そこで、sprintfにて先頭から[5]までの文字列を挿入後、先頭から[5]までの配列要素を削除(不要になるため)し、バイナリデータのみにしたいのですが、何か方法はありますでしょうか? NNNNNNDDDDDDDDDDDDDDDDD・・・・・DDDDD←1029番 から NNNNNNを削除し、 DDDDDDD・・・・・DDDDD のみにしたいと思っています。 よろしくお願いします。 c言語の配列操作 c言語で、hairetu[8][8]があったとして、その中でいくつかの中に1が入っていて、そのほかは0が入っているとします。 0 1 2 3 4 5 6 7 0|1 0 0 0 1 1 1 0 1|1 0 0 0 0 0 0 1 2|0 1 1 0 1 0 1 1 3|・・・・・・・・・・・・ 4|・・・・・・・・・・・・ 5| 6|・・・・・・・・・・・・ 7|0 1 1 0 0 0 0 1 という具合です。 そのとき、ランダムで1を1箇所しかない状態にしたいのですが、 自分が考えた方法だと無駄が多いので、もっとスマートな方法はないかと思い質問させてもらいました。基本的な質問なのですがよろしくお願いします。 以下自分が考えた方法 [64][2]の配列を作成し、上記の[8][8]の配列をfor文で解析し、1が入ってるところの番号を配列[64][2]に格納する。 乱数を使い、ひとつだけ選択する。 LISPで連想配列の操作? (setq ary '((A . 1) (B . 2) (C . 3))) で、perlでの $ary{'A'}++; や $ary{'B'}='X' や $ary{'C'}=$ary{'A'}+5; ということをさせたいのですが、LISPではどう書くのでしょうか? (assoc 'A ary) 2 (assoc 'B ary) X (assoc 'C ary) 7 という結果が欲しいです。 また、一度にaryの内容を表示させる Data::DumperのようなものはLISPにあるのでしょうか? 処理系はCommon LISPです。 連想配列の操作方法について A,B,C,D,E 1,3,4,5,7 2,4,6,7,10 4,5,1,4,8 このようなコンマ区切りテキストファイルを読み込み、次のような配列をつくるには、どうのようにしたよいか悩んでいます。 ご教授ください。 [A,1,2,4],・・・,[E,7,10,8] (行と列を置き換えるように配列を作成したい) データの抽出、配列操作で教えて下さい。 こんばんは、お世話になります。 配列操作で教えて頂きたく。 次のデータをuser.datとします。 1<>yamada<>99999<> 2<>tanaka<>22222<> 3<>suzuki<>10101<> 4<>yamada<>12345<> 5<>yamada<>55555<> user.datの中からyamadaの行だけ取り出して 3番目の数字データでソート表示したいのですが なかなかうまくいきません。 open(F,"user.dat"); @load_txt = <F>; close(F); foreach $data (@load_txt){ if((split(/<>/,$data)[2]) eq "$usid"){push(@txt_lines,$data);} } @txt_lines = sort{(split(/<>/,$a))[2] <=> (split(/<>/,$b))[2]}@txt_lines; 上記でおかしな所ありましたらご教示頂きたく 宜しくお願いします。 二次元配列のちょっと複雑な操作 よく二次元配列について質問させて頂いているのですが、再び失礼します。言葉でそのまま伝えられる自信がないので、ここでは分かりやすいように例を示して書きます。 二次元配列hairetsuは縦横共に0~2ずつの配列で出来ている3×3のマスだとします。 ◆例1◆ hairetsu[0] = new Array(0,0,0); hairetsu[1] = new Array(0,0,0); hairetsu[2] = new Array(0,0,0); そして、hairetsuの中の適当な数箇所の数値を0から1に変えたとします。 ◆例2◆ //乱数を使うなどして適当に代入した結果 hairetsu[0] = new Array(1,0,0); hairetsu[1] = new Array(0,0,1); hairetsu[2] = new Array(1,0,0); このとき、hairetsuの中央に位置するhairetsu[1][1]の周囲(左上、上、右上、右、左、左下、下、右下の8箇所)に1がいくつあるのかを数えたいのですが、なるべく簡潔な方法はありませんでしょうか。 なるべく伝わるように書いたつもりですが、不明な点がありましたら補足させて頂きますので、ご教示よろしくお願いします。
お礼
早速の回答ありがとうございました。 おかげさまで変数の宣言・格納など、 未熟ながら調べて理解することができました。 あいまいだった部分も、すっきりできました。 本当にありがとうございました。