1 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 04:30:21 ] プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 【Ruby1.9 は不安定な開発版であり初心者には全く向きません】 【最新安定版の Ruby1.8.7 の使用をお勧めします】 ※1.8.7 は1.8 と 1.9 の橋渡しをするためのリリースです。 1.9 の新機能の一部が利用可能なので初学者にお勧めです。 ※ただし十分安定しているとは言えないので プロダクション環境での利用にはお勧めしません。 関連スレやURLは>>2-8 あたりを見てください。Ruby on Railsの質問はRailsスレへ。 ■質問する人へ 質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。 ・モジュール名やエラーメッセージでググる ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/ ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。 ・詳しい内容(「動きません」「うまくできません」では回答しようがない) ・エラーメッセージ(自力で訳さずなるべくそのままで) ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる)) ・最終的にやりたいこと(もっとよい方法がある場合が多いので) 回答してくれた人には「ありがとう」のひとことをいってあげて。 ■回答する人へ 相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。 それができないならこないこと(だって初心者スレだもん)。 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
290 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 01:05:07 ] >>285 やっぱり文字列リテラルの閉じ忘れじゃないのかなぁ \223\276 って SJISの「得」なんで そんなのをスクリプトとして解釈しようとするなんて 文字列の閉じ忘れくらいしかない気がする 単純な文字列だけじゃなくて '〜' とか "〜"だけじゃなくて 正規表現リテラルとか /〜/ とか %記法の %w(〜) とか %Q(〜) %r!〜! みたいなのも有るんで %記法だと任意の記号を使えるので注意 しかも%記法の %q!! %Q!! %r!! %x!!だと、区切り文字に空白やタブや改行も使えてしまうぞ %q a だと'a' と同じ意味 そんなの使ったスクリプトなんて、もはや嫌がらせだが
291 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 01:40:27 ] >>274-275 にsyntax errorはないもんなぁ。 なんかダメもとでスクリプトの先頭に #!ruby -Ks と書き足してみるとか。
292 名前:274 mailto:sage [2008/12/09(火) 02:15:06 ] >>290 「得」は「得点」ですね・・・ ここに載せる際にエラーコードはそのままにhogeにしたのが原因です。すみません。 ちなみにhogeにして実行しても同じでした。 >>291 なんですか!?そのおまじない!w 書き足しただけでエラーコードに変化がありました。 C:/ruby/mysrc/rb81.tmp:61:in `method_missing': save (WIN32OLERuntimeError) OLE error code:800A03EC in Microsoft Office Excel Workbook クラスの Save プロパティを取得できません。 HRESULT error code:0x80020009 例外が発生しました。 from C:/ruby/mysrc/rb81.tmp:61 Complete(1) Saveがおかしい訳じゃないはずなので他に何かあるんでしょうね・・・ それと直接の関係はなさそう(上では表面化しなかっただけかも)ですが、 excel = WIN32OLE.new('Excel.Application')の下に WIN32OLE.const_load(excel, ExcelConst)を追加しました。 これがないと「ExcelConst::」の位置でエラーになるようです。
293 名前:274 mailto:sage [2008/12/09(火) 02:20:35 ] 連レススミマセン。 あとモジュール定義の所 module Excel end から module ExcelConst end に変更しています。
294 名前:291 mailto:sage [2008/12/09(火) 02:32:05 ] SJISの「ソ」みたいにSJISだと思わずに扱うと面倒が起きる文字があって、 rubyに-Ksオプションを付ける(shebangっぽく>>291 でもOK)と rubyもSJISで書かれたスクリプトだと承知して字句解析する。 リファレンスを引くなら$KCODEあたりがとっかかりだろうか。
295 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 02:48:40 ] >それと直接の関係はなさそう(上では表面化しなかっただけかも)ですが、 >excel = WIN32OLE.new('Excel.Application')の下に >WIN32OLE.const_load(excel, ExcelConst)を追加しました。 >これがないと「ExcelConst::」の位置でエラーになるようです。 それは当たり前です。ただ空のモジュールを作ったってExcelの定数を扱えるわけがありません。 なんかサンプルのスクリプトをもとに頑張ってる感じがしますが、もしそうだとしたら もうちょっとちゃんと真似したようがよいと思います。
296 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 02:49:44 ] そのファイルがあるディレクトリ以外だと実行できて、そのファイルがあるディレクトリだと実行できないのですが・・・。 ./hpricot.rb:35: undefined method `Hpricot' for main:Object (NoMethodError) from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' from hpri.rb:5 gem environmentでGEM PATHSの部分が - /usr/lib/ruby/gems/1.8 - /home/XXXXX/.gem/ruby/1.8 となっていてユーザディレクトリが含まれているのが怪しいと思うのですがここの設定を変えることはできるのですか?
297 名前:274 mailto:sage [2008/12/09(火) 03:03:27 ] >>291 なるほど。説明ありがとうございます。 「"#!ruby -Ks"」とググったらリファレンスのFAQがヒットしたので読んでました。 それと自己解決しました! >>292 のエラーコードの通りsaveプロパティの問題でした。 グラフを新しいシートに書き出したのが問題だったのかもしれません(勝手な予想) saveAsで上書きしたらうまく行きました。 >>295 スミマセン。仰る通りネット上に落ちてるコードを参考にいじって書いてます。 レス、指摘くれた方々ありがとうございました。 おかげさまで無事動かせました。
298 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 03:12:30 ] >>296 カレントディレクトリにhpricot.rbというファイルがあって それがrequireされているのではないでしょうか。
299 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 03:30:35 ] >>298 BINGOです!お恥ずかしい・・・・。 ファイル名で中身がわかるようにしていたらモジュール名を使っていました。 本当に初心者的なミスですいません。
300 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 03:38:05 ] ここは初心者スレだからOKだよ そのためのスレだよ >>298 ナイスエスパー きみにはエスパー初段を与える
301 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 03:43:02 ] >>298->>299 の流れを見ていたら和んでしまった >>299 をフォローする>>300 にも和んでしまった
302 名前:298 mailto:sage [2008/12/09(火) 03:50:28 ] なんかどっかのブログで>>296 みたいなミスと質問はFAQにして良くね? っていうエントリを見たばっかりだったもんで。あと ./hpricot.rb:35: undefined method `Hpricot' for main:Object (NoMethodError) ^^^^^^^^^^^ ここ。 わかりやすいファイル名にしたいという趣旨は理解できる。 例えばtry_とかいうプレフィクスがいいかも。 test_だとまんまテストみたいだし、experiment_とかattempt_とか長いし。
303 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 04:01:37 ] シェルスクリプトでRuby回してパイプして出力って一般的?
304 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 07:00:38 ] >>302 前スレでも同じ質問あったしな
305 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 08:38:19 ] >>303 日本語でおk
306 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 10:25:21 ] >>35 日本語でおkって言ってみたかっただけだろ。
307 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 11:09:26 ] おーっと>>306 くんロングパスだーッ
308 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 13:33:21 ] >>303 一般的
309 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 13:37:28 ] Ruby の each と File.open{|f| f.print} を使うかシェルスクリプトの for と > を使うかというのはけっこう大変な問題 STDIN から読み取って STDOUT に吐き出すべきなのはわかるがそれだと逆に面倒だったり
310 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 13:48:17 ] rubyでシェル作ればいいのに zshなんてゴミもう捨てたい
311 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 14:04:56 ] Rubyスクリプトを作ったらそれを起動するシェルスクリプトも作らなければならないのは鬱陶しい
312 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 14:11:46 ] ?
313 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 14:38:31 ] オプション指定とかに拘るからだろ 全部Rubyスクリプト内に入れろ ディレクトリパスとかも直書きだ 不安ならスクリプト内1行目くらいでDir.cdしろ
314 名前:デフォルトの名無しさん [2008/12/09(火) 16:17:01 ] 行き詰ったので再現コード晒します。 どこがまずいのか宜しく apiの使用はアカウント制なのでurl精製工程部分は抜けていますが、アカウントをとって作成してみてください。 たいして掛からずバグエラー吐きます。コロン抜きなどもしてみましたが、だめでした。 #!/usr/local/bin/ruby -Ks # REXML宣言 XMLデータを処理するための require 'rexml/document' # UR.scapeの宣言 サイトにアクセスするための require 'open-uri' # 文字コードを変換するための require 'nkf' # 文字コードをURL用にエンコード require 'uri' $doc counter = 1 while counter != 0 # このキーワードでは1ページ30商品、12ページあるはずなので変数pegenoをpegeno.to_sしてurlに組み込む result = open(楽天商品検索API (version:2008-09-01)でメタルギアをキーワードにしたurl) $doc = REXML::Document.new(result) pegeno = pegeno+1 sleep 1 pegeno = 1 if pegeno == 13 end
315 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 16:29:34 ] どれか特定のページのXMLのパーズでトラブってるんじゃないかと思うが... 一旦、各ページをファイルにセーブして、それを1個ずつ REXML::Document.new して、それだと再現しないわけ?
316 名前:デフォルトの名無しさん [2008/12/09(火) 16:37:25 ] >>315 REXML::Document.newする前に内容を保存するようにテストプログラムもしてみたんですけど、 エラーはいた後、そのファイルの内容を改めて食わすと普通に食っちゃうですよね。 特定のページでもなくて、ファィルが保存されているので、サーバーエラーでコケているわけでもない。 初心者なので食わすプログラムにヘマてる可能性もありますけど。
317 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 16:37:52 ] >>314 >>315 も言ってるけど一度ファイルに落としてみて それでも再現するなら、そのxmlをどっかにうpしてほしい。 ぶっちゃけて言うと、楽天商品検索APIとやらを調べるのがめんどい。
318 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 16:47:56 ] >>316 > 特定のページでもなくて というのは、Document.new の前に p pegeno を入れてみると、 毎回結果が違う、ということ?
319 名前:デフォルトの名無しさん [2008/12/09(火) 17:16:21 ] すいません、それではファイルの読み出しからREXML::Document.newにそのデータを読ませるまでのプログラムを書いてもらえますか。 その工程をヘマっているような不安も大いにあるもので、すいませんが宜しくお願いします。
320 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:35:53 ] 検索すればいくらでも出てくるだろ・・・ リファレンスちゃんと読め
321 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:38:27 ] open 'ファイル名' do |file| doc = REXML::Document.new file end これだけだが
322 名前:デフォルトの名無しさん [2008/12/09(火) 17:42:06 ] みなさん開発環境はNetBeansですか? それともeclipse?
323 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:43:55 ] お前はnetbeans使ってるんだからそれでいいだろ 他人のことなんか気にするな
324 名前:デフォルトの名無しさん [2008/12/09(火) 18:20:43 ] 今実験してみました。 まず、バグエラー吐いたファイルを >>321 のプログラムで読み込ませて見ましたが、普通に食って Complete(0) って正常終了表示されました。 次にエラーを吐く前のページ(REXML::Document.newしてもエラーはかなかったページ) もして見ましたが、やはり Complete(0) っと正常終了。 こうなると、xmlデータを連続してREXML::Document.newにかけた時に問題が発生している気がするのですが。
325 名前:デフォルトの名無しさん [2008/12/09(火) 18:25:44 ] 訂正 まず、バグエラー吐いたページを保存したファイルを
326 名前:デフォルトの名無しさん [2008/12/09(火) 18:40:57 ] 念のため、検索結果1-12ページを保存した後、 >>321 の方法で連続して1-12ページをREXML::Document.newに読ませるループを組んでみました。 すると1-12ページまで問題なく読んだのですが、2週目の11ページ目でバグエラーを吐きました。 何が原因なんでしょうか。
327 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 19:11:11 ] ああ「バグエラー」ってsegvか・・・って、まだやってたのかw ・ファイルに落とすだけならエラーが出ない ・ファイルから読んでREXMLに放り込むだけならエラーが出ない なら、二回ruby起動して別々に処理すればいいんじゃない?
328 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 22:39:42 ] すみません。ちょっと質問させてください。 色々と試した結果、Rubyを使おうと思っています。 それで、特定のディレクトリのファイルを、 任意のディレクトリにサブディレクトリごとコピーし、 その中のファイルの内容を正規表現で置換し、 その上でファイル名も置換したいのです。 ディレクトリは数十、ファイルは数百くらいです。 こういう処理をショートカット一発でやりたいのですが可能でしょうか? ちなみにWindowsXPです。 また、Ruby初心者でも簡単に可能かどうかお聞かせ頂ければ幸いです。
329 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 22:57:21 ] .rbがRubyインタプリタに関連付けされていれば 「こういう処理」をするRubyスクリプトを書いてそのショートカットを作ればいいです。
330 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 23:58:26 ] >>314 せっかく再現コードを載せてくれたから試そうとおもったけど、 やっぱりこれじゃわかんないや。 できれば ttp://gist.github.com/ とかにコードを載っけてくれない? あと pegeno は page_no とかにしたほうがいいよ pegeはカッコワルイ
331 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 00:54:41 ] 記事内の動詞や名詞の数を数えるモジュールもしくはこういうモジュール使ったら実現できるよ というものはありますか? 数え上げるのがどういう技術なのかわからないので検索すらできませんでした
332 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 00:57:49 ] 形態素解析 でぐぐる
333 名前:デフォルトの名無しさん [2008/12/10(水) 01:07:01 ] すいません、特定の文字を改行に置き換えるにはどのようにすればいいのでしょうか。 変数a1に内容が入っているとした場合、 a1 = a1.gsub(/a1e1ee/,"\n") これだと C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/rb15.tmp:412: private method `gsub' called for #<Array:0x2bb23b0> (NoMethodError) エラーを吐くですけど。改行を別の文字に置き換えるのは問題なくできたんですが。
334 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:14:19 ] ちゃんとそのエラーを見てください。 `gsub' called for #<Array:0x2bb23b0> ^^^^^^^^^^^^^^^^^^^^^^^^ a1があなたの期待しているようなStringの値ではないのです。
335 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:17:22 ] >>333 Stringオブジェクトにするべき操作をArrayオブジェクトに対して行ってる。 a1の由来がわからないとたしかなことは言えないけど、おそらく文字列配列だから a1.join.gsub で一つのStringオブジェクトにするか a1.map{|v| v.gsub } で中のStringオブジェクトにひとつづつアクセスしてごらん。
336 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:20:13 ] ここのスレ住人の親切さは異常 レス貰いっぱなしじゃなくて礼の一つも言おうぜ>連日ageてる人
337 名前:デフォルトの名無しさん [2008/12/10(水) 01:26:27 ] >>334 >>335 このエラーメッセージでは分かりませんでしたw みなさんの説明でぴんときました。 最初私はこのようにしていたのですが、 a1 = a1.gsub(/\n/,"a1e1ee") a1 = a1.scan(/<Body>.*<\/Body>/) a1 = a2.gsub(/a1e1ee/,"\n") この時点でa1は配列化したのですね。>a1 = a1.scan(/<Body>.*<\/Body>/) なのでこのように修正したらうまく行きました。 a1 = a1.gsub(/\n/,"a1e1ee") a1 = a1.scan(/<Body>.*<\/Body>/) a2 = a1[0] a1 = a2.gsub(/a1e1ee/,"\n")
338 名前:デフォルトの名無しさん [2008/12/10(水) 01:30:34 ] >>336 すいません、みなさんありがとうございます。
339 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:32:50 ] >>332 ありがとうございます Mecabを入れてMecab-rubyも入れました。まずはMecabとHpricotを組み合わせてみようと require 'rubygems' require 'open-uri' require 'kconv' require 'hpricot' require 'MeCab' doc = Hpricot(open("ameblo.jp/staff/ ").read) doc.search("div.subContents").each{|content| content_html = content.inner_html.to_s.toutf8 content_text = content.inner_text.to_s.toutf8 puts content_html puts content_text puts content_html.split(//).size puts content_text.split(//).size chasen = content.MeCab::Tagger.new("-Ochasen") puts chasen.parseToNode(str) } とやってみたのですが mecabun.rb:17: undefined method `MeCab' for #<Hpricot::Elem:0xb6f501d4> (NoMethodError) from test.rb:8:in `each' from test.rb:8 となってしました。 gemでMecab周辺がそろえられなかったのでどのようなことができるのかわかりませんでした。
340 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:38:03 ] >>339 >chasen = content.MeCab::Tagger.new("-Ochasen") おちつけw
341 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:49:26 ] >>340 すいません mecab = MeCab::Tagger.new("-Ochasen") puts mecab.parseToNode(content) と変えてみたのですがこんどは mecabun.rb:18:in `parseToNode': in method 'parseToNode', argument 2 of type 'char const *' (TypeError) from mecabun.rb:18 from mecabun.rb:8:in `each' from mecabun.rb:8 となってしまいます。
342 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:52:40 ] >>341 p content として、contentの値を確かめてみて
343 名前:341 mailto:sage [2008/12/10(水) 01:56:19 ] parseToNodeではなくてparseでした。エラーは同じでした
344 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:58:03 ] >>341 渡すべきはcontent_textのような。
345 名前:341 mailto:sage [2008/12/10(水) 02:01:41 ] {elem <div class="subContents"> "\n" {comment <!--messageTop-->} "\n" {elem <center> "\343\202\242\343\203〜〜〜3\240\343\201\270 \342\226\240" </a>} "\r\n " </center>} "\n" {comment <!--messageBottom-->} "\n" </div>} という感じでした。 文字コードの設定なんでしょうか?
346 名前:341 mailto:sage [2008/12/10(水) 02:04:30 ] >>344 うまくいきました!!! p content から p content_textでも文字化けでした。
347 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 02:17:03 ] >>346 p content_text の文字化けはたぶん問題ない puts context_text.class とすれば String になっているはず puts context_text とすれば文字列が表示されるはず
348 名前:341 mailto:sage [2008/12/10(水) 02:41:48 ] >>347 ありがとうございます!文字列表示されました。 動詞や名詞の数も不格好かも知れませんが、まずは出力をカウントしていく感じでやってみます。 皆さんありがとうございます!
349 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 02:55:19 ] 俺も>>341 が使ってるhpricotを使ってるけど、nokogiriちゅうのを見かけたんだけど誰か使っている奴いる? hpricotより早いちゅう感じらしいが
350 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 03:14:23 ] mechanizeにHpricotの代わりに使ってる。 なんせWinだとgemでHpricot入れるのが難儀なもんで。
351 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 06:35:38 ] Nokogiriのインストールがgem一発で簡単であるかのような表現はやめて頂きたく存じ上げ奉り候
352 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 06:39:17 ] つーかWinでHpricotのインストールが難しいってどういうこと?
353 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 06:45:52 ] >>352 難しくなかった人はたまたま最新バージョンに Win バイナリがあった人 最新バージョンに Win バイナリが無い場合、バイナリのあるバージョンを手で指定しないとインストールが終了しない これは gem update のアップグレードが悲惨
354 名前:350 mailto:sage [2008/12/10(水) 07:36:46 ] >>351 やっぱりプロジェクトが活発でなくなるとHpricotみたいにバイナリを用意してもらえず 難しくなるかなぁ… 自分は今のところgemで一発でした。
355 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 17:15:59 ] バイナリを用意してもらえなくなったら、自分が用意する番だよ。
356 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 18:29:46 ] irb に --noinspect をつけると、式の結果を inspect するのを やめさせることができますが、同じことを irb のプロンプトから 行うことはできますか。 irb を使ってて、inspect による評価を一時的にやめさせようと しています。 irb> IRB.conf[:INSPECT_MODE] = false とかしてみましたけど、かわりませんでした。
357 名前:328 mailto:sage [2008/12/10(水) 18:43:11 ] >>329 ありがとうございます。安心しました。 あと、数百のファイルをコピーする時、 ファイル名を一つ一つ変更したいのですが、 それも可能でしょうか? 名前を一つ一つ打ち込めばできますが、 ファイルの数が数百もあるので、 正規表現で置換するような形でリネームしたいのです。 「コードが一行で済まないかな」と思っています。
358 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 19:02:26 ] >>356 IRB.conf[:MAIN_CONTEXT].inspect_mode = false >>357 どういうファイル名をどのように変えるのかがわからないとなんとも。 あと一行でっていうのは、やればできるんだろうけど いわゆる玄人御用達だからオススメしない。
359 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 19:15:12 ] >>358 やってみましたが、かわんないです。 あいかわらず inspect の結果が表示されます。
360 名前:デフォルトの名無しさん [2008/12/10(水) 19:21:59 ] ruby -i ky_*.txt -pe '$_.sub!(/麻生太郎/, "阿呆太郎")' *.txt で動くかもしれない。
361 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 19:30:59 ] >>359 やりたいのは--noechoじゃない? IRB.conf[:MAIN_CONTEXT].echo = false
362 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 21:21:39 ] >>357 御返事ありがとうございます。 元ファイル名は大体このような感じです。 hoge_428_20-01.txt hoge と数字の部分が違っているものが数百ほどあります。 それを別のディレクトリにコピーする時に、 index_428_20-01.tex というような形に変えたいのです。 先頭と拡張子の部分を置換する格好になります。 置換を正規表現で表現すると次のようになります。 検索 [a-z]+([\d_\-])+\.txt 置換 index\1.tex このようなリネーム処理を、 ファイル(ディレクトリ)コピー時に同時に行いたいのです。
363 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 21:24:33 ] >>361 びんごです! さすが特務エスパー、多謝です
364 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 21:27:48 ] >>362 だからできるっつの めんどくさいので、対象ファイルの指定も実際のコピーもRubyでやれ これらを外部から読み込むように作ろうとすると敷居が微妙に高い より正確に言うと変なものが混じったときのエラー処理がめんどい
365 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 09:33:52 ] >>362 これを参考にしてみて。 require 'fileutils' from = /[a-z]+(¥d_¥-])+¥.txt$/ to = 'index¥1.tex' filenames.each do |filename| new_filename = filename.sub from, to FileUtils.mv filename, new_filename if filename != new_filename end >>364 役立たずなレス 初心者の相手ができないならくんなよ
366 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 15:31:12 ] def func a = ["hage","hoge","hage"] a.each{|elem| return true if elem="hoge" } return false end 上記のようなコードを書くと、funcの返り値が[false,true,false]になってしまうのですが、 trueひとつにしたい場合はどのようにしたらよいでしょうか
367 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 15:36:25 ] >>366 ごめんなさい、これ勘違いだったので見なかったことに
368 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 15:37:11 ] >>365 のスクリプトがキモい件について
369 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 15:50:06 ] Ruby式ではないな 他の言語の人間だ
370 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 16:19:31 ] 初心者にあんま見せたくない書き方であることは間違いないね…
371 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 16:23:39 ] htmlデータからタグの間に挟まれた文字のみ取り出すにはどうすればいいですしようか。 タグ名もバラバラです。 例 <b1>殿様カエル</b1><b2>しり上がり</b2><goow>自転車</goow> タグごと取り出す方法は分かったのですが。
372 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 16:28:04 ] >>365 をrubyらしくってどう書けばいいの? rename_rule=[..., ...] def mkdistnme file x.sub *rename_rule end def movefile from, to ... end filenames.map{|x| [x, mkdistnme x]}.each{|ft| movefile *ft}
373 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 16:41:37 ] >>371 hpricotとかでパースするのをオススメしたいけど 慣れるまでが難しいかも知れない。 ネスト構造無視でいいなら str = "<b1>殿様カエル</b1><b2>しり上がり</b2><goow>自転車</goow>" ary = [] str.gsub(/<.+?>(.+?)<\/.+?>/){ary << $1} gsub使うのに違和感あるから、もっといい方法があるかも?
374 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 17:02:02 ] >>371 deleteの動作(主に返り値)に注意 str = "<b1>殿様カエル</b1><b2>しり上がり</b2><goow>自転車</goow>" arr = str.split(/<.+?>/) arr.delete('') puts arr 殿様カエル しり上がり 自転車 HTMLとしてパースするのが真っ当
375 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 17:09:31 ] >deleteの動作 そういえばなんでArrayの一部メソッドは破壊的な操作をするのに !がついてないんだろう。perl由来の名残のような気もするけど ary = [].push data [].push! data と書きそうになることがよくある。
376 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 17:34:18 ] a = [1,2,3] b = [4,5,6] a.each{|i| puts i} b.each{|i| puts i} とやると 123456 の順に表示されますが a.calleach b.calleach puts "A" a.calleach puts "B" b.calleach a.calleach puts "C" b.calleach のようにeachの各ループが実行されるタイミングを自分で制御してこの例では 14A2B53C6 という順で出力されるようなイテレータの書き方というか呼び方あったら教えてください。 自分でインデックス変数も合わせて用意すればいいんでしょうが もう少し簡潔なのがあれば嬉しいです。
377 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 17:44:16 ] >>376 それはプログラム構造そのものが間違っている 絶対にあとで破綻するから、いまのうちに書き直せ で、その時間がないという場合は、配列をキューとみなして使う a.shift b.shift puts "A" a.shift puts "B" b.shift a.shift puts "C" b.shift
378 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 17:47:21 ] >>376 1.8ならGenerator、1.9ならEnumeratorがそんな感じだけど 推測するにEnumerable#zipで十分なんじゃないかな [1,2,3].zip([4,5,6], ["A","B","C"]) {|ary| puts ary }
379 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 17:47:42 ] >>376 継続とかcall/ccとかコルーチンとかだっけ。 require 'generator' g = Generator.new([1,2,3]) g.next
380 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 17:50:28 ] 外部イテレータ ね
381 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 18:02:39 ] >>375 !は「破壊的」という意味ではない。 !の意味は、それが付かない同名メソッドと比較して、注意すべき挙動の違いがある、という意味。
382 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 18:17:24 ] >>381 二種類提供する場合のみってことか。サンクス。 ttp://shugo.net/ruby-codeconv/codeconv.html >破壊的なメソッドと非破壊的なメソッドの両方を提供する場合、 >破壊的なメソッドには`!'を付ける。 ttp://www.ruby-lang.org/ja/man/html/FAQ_A5E1A5BDA5C3A5C9.html#a5.2e12.20.c7.cb.b2.f5.c5.aa.a5.e1.a5.bd.a5.c3.a5.c9.a4.c8.a4.cf.b2.bf.a4.c7.a4.b9.a4.ab >同名のメソッドがあって、一方はオブジェクトのコピーを作って返し、 >もう一方は変更されたオブジェクトを返すようになっている場合、 >!のついた方が破壊的メソッドです。ただし、!がつかないメソッドの中にも >String#concatのように破壊的なものはあります。
383 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 18:52:51 ] >>365 ありがとうございます。 Rubyは初心者ですが、頑張って使いこなせるようになりたいです。
384 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 19:45:42 ] >>365 正規表現まちがってる。 >from = /[a-z]+(¥d_¥-])+¥.txt$/ from = /[a-z]+([¥d_¥-]+)¥.txt$/ あるいは from = /¥w+([-_¥d]+)¥.txt$/ とか。[a-z]+ はたぶん ¥w+ で済むんじゃないか。 >>372 十分 Ruby らしいと思うけどね。負け惜しみだと思うよ、>>368-370 は。
385 名前:デフォルトの名無しさん [2008/12/11(木) 19:59:40 ] 質問です。 Rateというクラスをインスタンスにして配列にしたいのですが、 @rates = Array.new(Rate.new) と書くと、 can't convert Rate into Integer というエラーメッセージが帰ってきて配列に出来ません。 どのようにすれば、インスタンス化したクラスを配列に出来るのでしょうか?
386 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 20:04:42 ] >>385 www.ruby-lang.org/ja/man/html/Array.html#Array.2enew newの第一引数は整数か配列。 というわけで @rates = [ Rate.new ]
387 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 20:06:10 ] >>384 $は文字列末尾じゃないぞ。
388 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 20:15:42 ] Array#zip は、引数のほうが長い場合は残りを無視するようですが、 これを無視しないようなオプションとかありますか。 コード: ['A','B'].zip([1,2,3,4]) {|c, i| puts "#{c}, #{i}" } 結果: A, 1 B, 2 希望: A, 1 B, 2 nil, 3 nil, 4
389 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 20:20:23 ] >>388 [1,2,3,4].zip(["A","B"]).map{|i| i.reverse}
390 名前:385 mailto:sage [2008/12/11(木) 20:25:26 ] >>386 ありがとうございます!