Ruby 初心者スレッド ..
[2ch|▼Menu]
279:デフォルトの名無しさん
08/12/08 18:44:44
>>276
> C:/ruby/mysrc/rb3C.tmp:112: syntax error, unexpected tCONSTANT, expecting kEND
これがエラーの理由、「syntax error」は文法エラー
> chart1.Axes(ExcelConst::XlCategory, ExcelConst::XlPrimary).HasTitle = "True"
これがエラーの出た行の内容
> ^
(ブラウザだとずれてるだろうけど)これが上の行のエラーの発生してる位置を示してる

rb3C.tmpの112行目より前のどこかに閉じ忘れた " がある
エラーメッセージぐらい読めるようにならないと、いつまでたっても素人のままだぜ

280:デフォルトの名無しさん
08/12/08 20:32:41
endの閉じ忘れ文法エラーが初心者の頃は面倒だったね
どこで閉じ忘れたのかを探しにくいからね

1.9.1だとendのインデントのずれを指摘するパッチが取り込まれたので
-wオプションつければずれてるendを警告してくれて
抜けてるendの位置をちょっと絞り込める

ところで、エラーメッセージの
tCONSTANT とか kENDってなに?
YACCのトークンとかいうやつ?
構文解釈中のエラー?
そんな内部の情報を直に見せられても、初心者にはわけわからんよ
ま、わからんなりに
「endじゃなくて定数が来ちゃってる文法エラー」だなということは理解できるんだけど


281:デフォルトの名無しさん
08/12/08 20:46:15
文字列リテラルの閉じ忘れはエラーがどかどかでるので割と判りやすいけど
閉じ忘れた文字列から、はるか後ろのほうでエラーが出る場合があるので
やっぱり最初の頃は修正が面倒だったな

エラーが出た個所で文字列を閉じてるのが ' か " を確認して、
それより前のクォート文字を検索する
閉じ忘れたのが %記法だったら面倒だが

たまに、Windowsのディレクトリパスを書くときに 'C:\test\' とかやって閉じ忘れたりする


282:デフォルトの名無しさん
08/12/08 20:47:57
tCONSTANT は定数トークンだろね
でも kEND の k ってなんじゃろ

283:デフォルトの名無しさん
08/12/08 20:56:28
keyword

284:282
08/12/08 21:03:46
>>283
なるほどサンクス
いい機会だから parse.y 眺めてるお

285:274
08/12/08 22:04:13
>>279
レスありがとうございます。
よく見直してみたんですが、「"」の閉じ忘れはありませんでした。
グラフの部分のコードを消して試しに他の操作をさせるとちゃんと動いたので
やはりグラフのコードのどこかが悪いようです。



286:デフォルトの名無しさん
08/12/08 22:47:39
すごいバカきたな。
>>258
>そんなどのマニュアルにもどんな解説にも書いてあるようなことで>>255さんが詰まるはずないだろ馬鹿か?
実際に詰まってるじゃん。
どのマニュアルにもどんな解説にも書いてあるようなことで詰まっているから初心者なんじゃねーの?
もう一度>>255をみてみろ。
>result = open(a2)
>resultには#<File:0x2c07f2c>という内容しか入っていないようなのですが、
そりゃ open() の戻り値を代入しているだけなんだから、result.inspect したら #<File:> が入ってるわな。
HTMLの文字列が欲しいのに、Fileオブジェクトがきたので困ってる255さん。あーら困った。

>[BUG] って書いてあるんだからこっちに落ち度はなくてRubyが一方的に悪いに決まってるだろ
え、どこ? >>255のどこに[BUG]って書いているの?
もしかして>>255>>205と関係しているの?
なんで>>258>>255の書き込みだけでなんでそんなことがわかるの?
もしかして205=255=258なの?
もしかしてどんな解説にも書いてあるようなことで詰まってしまったの?

287:デフォルトの名無しさん
08/12/08 22:50:02
すごいバカが来たな。

288:デフォルトの名無しさん
08/12/08 22:58:26
こういうバカはたいては女
それも女の出来そこないって相場が決まってるw

289:274
08/12/09 00:49:17
WIN32OLEに詳しい方、引き続き>>274救助待ちなのでお願いします。

290:デフォルトの名無しさん
08/12/09 01:05:07
>>285
やっぱり文字列リテラルの閉じ忘れじゃないのかなぁ
\223\276 って SJISの「得」なんで
そんなのをスクリプトとして解釈しようとするなんて
文字列の閉じ忘れくらいしかない気がする

単純な文字列だけじゃなくて
'〜' とか "〜"だけじゃなくて 正規表現リテラルとか /〜/ とか
%記法の %w(〜) とか %Q(〜) %r!〜! みたいなのも有るんで
%記法だと任意の記号を使えるので注意

しかも%記法の %q!! %Q!! %r!! %x!!だと、区切り文字に空白やタブや改行も使えてしまうぞ
%q a だと'a' と同じ意味
そんなの使ったスクリプトなんて、もはや嫌がらせだが


291:デフォルトの名無しさん
08/12/09 01:40:27
>>274-275にsyntax errorはないもんなぁ。
なんかダメもとでスクリプトの先頭に
#!ruby -Ks
と書き足してみるとか。

292:274
08/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
08/12/09 02:20:35
連レススミマセン。
あとモジュール定義の所
module Excel
end
から
module ExcelConst
end
に変更しています。

294:291
08/12/09 02:32:05
SJISの「ソ」みたいにSJISだと思わずに扱うと面倒が起きる文字があって、
rubyに-Ksオプションを付ける(shebangっぽく>>291でもOK)と
rubyもSJISで書かれたスクリプトだと承知して字句解析する。

リファレンスを引くなら$KCODEあたりがとっかかりだろうか。

295:デフォルトの名無しさん
08/12/09 02:48:40
>それと直接の関係はなさそう(上では表面化しなかっただけかも)ですが、
>excel = WIN32OLE.new('Excel.Application')の下に
>WIN32OLE.const_load(excel, ExcelConst)を追加しました。
>これがないと「ExcelConst::」の位置でエラーになるようです。

それは当たり前です。ただ空のモジュールを作ったってExcelの定数を扱えるわけがありません。
なんかサンプルのスクリプトをもとに頑張ってる感じがしますが、もしそうだとしたら
もうちょっとちゃんと真似したようがよいと思います。

296:デフォルトの名無しさん
08/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
08/12/09 03:03:27
>>291
なるほど。説明ありがとうございます。
「"#!ruby -Ks"」とググったらリファレンスのFAQがヒットしたので読んでました。

それと自己解決しました!
>>292のエラーコードの通りsaveプロパティの問題でした。
グラフを新しいシートに書き出したのが問題だったのかもしれません(勝手な予想)
saveAsで上書きしたらうまく行きました。

>>295
スミマセン。仰る通りネット上に落ちてるコードを参考にいじって書いてます。


レス、指摘くれた方々ありがとうございました。
おかげさまで無事動かせました。

298:デフォルトの名無しさん
08/12/09 03:12:30
>>296
カレントディレクトリにhpricot.rbというファイルがあって
それがrequireされているのではないでしょうか。

299:デフォルトの名無しさん
08/12/09 03:30:35
>>298
BINGOです!お恥ずかしい・・・・。
ファイル名で中身がわかるようにしていたらモジュール名を使っていました。
本当に初心者的なミスですいません。

300:デフォルトの名無しさん
08/12/09 03:38:05
ここは初心者スレだからOKだよ
そのためのスレだよ

>>298
ナイスエスパー
きみにはエスパー初段を与える

301:デフォルトの名無しさん
08/12/09 03:43:02
>>298->>299の流れを見ていたら和んでしまった
>>299をフォローする>>300にも和んでしまった

302:298
08/12/09 03:50:28
なんかどっかのブログで>>296みたいなミスと質問はFAQにして良くね?
っていうエントリを見たばっかりだったもんで。あと
./hpricot.rb:35: undefined method `Hpricot' for main:Object (NoMethodError)
^^^^^^^^^^^
ここ。

わかりやすいファイル名にしたいという趣旨は理解できる。
例えばtry_とかいうプレフィクスがいいかも。
test_だとまんまテストみたいだし、experiment_とかattempt_とか長いし。

303:デフォルトの名無しさん
08/12/09 04:01:37
シェルスクリプトでRuby回してパイプして出力って一般的?

304:デフォルトの名無しさん
08/12/09 07:00:38
>>302
前スレでも同じ質問あったしな

305:デフォルトの名無しさん
08/12/09 08:38:19
>>303
日本語でおk


306:デフォルトの名無しさん
08/12/09 10:25:21
>>35
日本語でおkって言ってみたかっただけだろ。

307:デフォルトの名無しさん
08/12/09 11:09:26
おーっと>>306くんロングパスだーッ

308:デフォルトの名無しさん
08/12/09 13:33:21
>>303
一般的

309:デフォルトの名無しさん
08/12/09 13:37:28
Ruby の each と File.open{|f| f.print} を使うかシェルスクリプトの for と > を使うかというのはけっこう大変な問題
STDIN から読み取って STDOUT に吐き出すべきなのはわかるがそれだと逆に面倒だったり

310:デフォルトの名無しさん
08/12/09 13:48:17
rubyでシェル作ればいいのに
zshなんてゴミもう捨てたい

311:デフォルトの名無しさん
08/12/09 14:04:56
Rubyスクリプトを作ったらそれを起動するシェルスクリプトも作らなければならないのは鬱陶しい

312:デフォルトの名無しさん
08/12/09 14:11:46


313:デフォルトの名無しさん
08/12/09 14:38:31
オプション指定とかに拘るからだろ
全部Rubyスクリプト内に入れろ
ディレクトリパスとかも直書きだ
不安ならスクリプト内1行目くらいでDir.cdしろ

314:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/09 16:29:34
どれか特定のページのXMLのパーズでトラブってるんじゃないかと思うが...

一旦、各ページをファイルにセーブして、それを1個ずつ REXML::Document.new
して、それだと再現しないわけ?

316:デフォルトの名無しさん
08/12/09 16:37:25
>>315
REXML::Document.newする前に内容を保存するようにテストプログラムもしてみたんですけど、
エラーはいた後、そのファイルの内容を改めて食わすと普通に食っちゃうですよね。
特定のページでもなくて、ファィルが保存されているので、サーバーエラーでコケているわけでもない。
初心者なので食わすプログラムにヘマてる可能性もありますけど。


317:デフォルトの名無しさん
08/12/09 16:37:52
>>314
>>315も言ってるけど一度ファイルに落としてみて
それでも再現するなら、そのxmlをどっかにうpしてほしい。

ぶっちゃけて言うと、楽天商品検索APIとやらを調べるのがめんどい。

318:デフォルトの名無しさん
08/12/09 16:47:56
>>316
> 特定のページでもなくて

というのは、Document.new の前に p pegeno を入れてみると、
毎回結果が違う、ということ?

319:デフォルトの名無しさん
08/12/09 17:16:21
すいません、それではファイルの読み出しからREXML::Document.newにそのデータを読ませるまでのプログラムを書いてもらえますか。
その工程をヘマっているような不安も大いにあるもので、すいませんが宜しくお願いします。


320:デフォルトの名無しさん
08/12/09 17:35:53
検索すればいくらでも出てくるだろ・・・
リファレンスちゃんと読め

321:デフォルトの名無しさん
08/12/09 17:38:27
open 'ファイル名' do |file|
 doc = REXML::Document.new file
end

これだけだが

322:デフォルトの名無しさん
08/12/09 17:42:06
みなさん開発環境はNetBeansですか?
それともeclipse?

323:デフォルトの名無しさん
08/12/09 17:43:55
お前はnetbeans使ってるんだからそれでいいだろ
他人のことなんか気にするな

324:デフォルトの名無しさん
08/12/09 18:20:43
今実験してみました。
まず、バグエラー吐いたファイルを
>>321 のプログラムで読み込ませて見ましたが、普通に食って
Complete(0)
って正常終了表示されました。
次にエラーを吐く前のページ(REXML::Document.newしてもエラーはかなかったページ)
もして見ましたが、やはり
Complete(0)
っと正常終了。
こうなると、xmlデータを連続してREXML::Document.newにかけた時に問題が発生している気がするのですが。

325:デフォルトの名無しさん
08/12/09 18:25:44
訂正
まず、バグエラー吐いたページを保存したファイルを

326:デフォルトの名無しさん
08/12/09 18:40:57
念のため、検索結果1-12ページを保存した後、
>>321 の方法で連続して1-12ページをREXML::Document.newに読ませるループを組んでみました。
すると1-12ページまで問題なく読んだのですが、2週目の11ページ目でバグエラーを吐きました。

何が原因なんでしょうか。


327:デフォルトの名無しさん
08/12/09 19:11:11
ああ「バグエラー」ってsegvか・・・って、まだやってたのかw

・ファイルに落とすだけならエラーが出ない
・ファイルから読んでREXMLに放り込むだけならエラーが出ない
なら、二回ruby起動して別々に処理すればいいんじゃない?

328:デフォルトの名無しさん
08/12/09 22:39:42
すみません。ちょっと質問させてください。
色々と試した結果、Rubyを使おうと思っています。

それで、特定のディレクトリのファイルを、
任意のディレクトリにサブディレクトリごとコピーし、
その中のファイルの内容を正規表現で置換し、
その上でファイル名も置換したいのです。
ディレクトリは数十、ファイルは数百くらいです。

こういう処理をショートカット一発でやりたいのですが可能でしょうか?
ちなみにWindowsXPです。
また、Ruby初心者でも簡単に可能かどうかお聞かせ頂ければ幸いです。

329:デフォルトの名無しさん
08/12/09 22:57:21
.rbがRubyインタプリタに関連付けされていれば
「こういう処理」をするRubyスクリプトを書いてそのショートカットを作ればいいです。

330:デフォルトの名無しさん
08/12/09 23:58:26
>>314
せっかく再現コードを載せてくれたから試そうとおもったけど、
やっぱりこれじゃわかんないや。
できれば URLリンク(gist.github.com) とかにコードを載っけてくれない?
あと pegeno は page_no とかにしたほうがいいよ
pegeはカッコワルイ

331:デフォルトの名無しさん
08/12/10 00:54:41
記事内の動詞や名詞の数を数えるモジュールもしくはこういうモジュール使ったら実現できるよ
というものはありますか?
数え上げるのがどういう技術なのかわからないので検索すらできませんでした

332:デフォルトの名無しさん
08/12/10 00:57:49
形態素解析 でぐぐる

333:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/10 01:14:19
ちゃんとそのエラーを見てください。
`gsub' called for #<Array:0x2bb23b0>
^^^^^^^^^^^^^^^^^^^^^^^^

a1があなたの期待しているようなStringの値ではないのです。

335:デフォルトの名無しさん
08/12/10 01:17:22
>>333
Stringオブジェクトにするべき操作をArrayオブジェクトに対して行ってる。
a1の由来がわからないとたしかなことは言えないけど、おそらく文字列配列だから
a1.join.gsub
で一つのStringオブジェクトにするか
a1.map{|v| v.gsub }
で中のStringオブジェクトにひとつづつアクセスしてごらん。

336:デフォルトの名無しさん
08/12/10 01:20:13
ここのスレ住人の親切さは異常
レス貰いっぱなしじゃなくて礼の一つも言おうぜ>連日ageてる人

337:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/10 01:30:34
>>336
すいません、みなさんありがとうございます。

339:デフォルトの名無しさん
08/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("URLリンク(ameblo.jp)").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:デフォルトの名無しさん
08/12/10 01:38:03
>>339
>chasen = content.MeCab::Tagger.new("-Ochasen")
おちつけw

341:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/10 01:52:40
>>341
p content
として、contentの値を確かめてみて

343:341
08/12/10 01:56:19
parseToNodeではなくてparseでした。エラーは同じでした

344:デフォルトの名無しさん
08/12/10 01:58:03
>>341
渡すべきはcontent_textのような。


345:341
08/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
08/12/10 02:04:30
>>344
うまくいきました!!!
p content から p content_textでも文字化けでした。

347:デフォルトの名無しさん
08/12/10 02:17:03
>>346
p content_text の文字化けはたぶん問題ない
puts context_text.class とすれば String になっているはず
puts context_text とすれば文字列が表示されるはず

348:341
08/12/10 02:41:48
>>347
ありがとうございます!文字列表示されました。
動詞や名詞の数も不格好かも知れませんが、まずは出力をカウントしていく感じでやってみます。
皆さんありがとうございます!

349:デフォルトの名無しさん
08/12/10 02:55:19
俺も>>341が使ってるhpricotを使ってるけど、nokogiriちゅうのを見かけたんだけど誰か使っている奴いる?
hpricotより早いちゅう感じらしいが

350:デフォルトの名無しさん
08/12/10 03:14:23
mechanizeにHpricotの代わりに使ってる。
なんせWinだとgemでHpricot入れるのが難儀なもんで。

351:デフォルトの名無しさん
08/12/10 06:35:38
Nokogiriのインストールがgem一発で簡単であるかのような表現はやめて頂きたく存じ上げ奉り候

352:デフォルトの名無しさん
08/12/10 06:39:17
つーかWinでHpricotのインストールが難しいってどういうこと?

353:デフォルトの名無しさん
08/12/10 06:45:52
>>352
難しくなかった人はたまたま最新バージョンに Win バイナリがあった人
最新バージョンに Win バイナリが無い場合、バイナリのあるバージョンを手で指定しないとインストールが終了しない
これは gem update のアップグレードが悲惨

354:350
08/12/10 07:36:46
>>351
やっぱりプロジェクトが活発でなくなるとHpricotみたいにバイナリを用意してもらえず
難しくなるかなぁ…
自分は今のところgemで一発でした。

355:デフォルトの名無しさん
08/12/10 17:15:59
バイナリを用意してもらえなくなったら、自分が用意する番だよ。

356:デフォルトの名無しさん
08/12/10 18:29:46
irb に --noinspect をつけると、式の結果を inspect するのを
やめさせることができますが、同じことを irb のプロンプトから
行うことはできますか。
irb を使ってて、inspect による評価を一時的にやめさせようと
しています。

irb> IRB.conf[:INSPECT_MODE] = false

とかしてみましたけど、かわりませんでした。



357:328
08/12/10 18:43:11
>>329
ありがとうございます。安心しました。

あと、数百のファイルをコピーする時、
ファイル名を一つ一つ変更したいのですが、
それも可能でしょうか?

名前を一つ一つ打ち込めばできますが、
ファイルの数が数百もあるので、
正規表現で置換するような形でリネームしたいのです。
「コードが一行で済まないかな」と思っています。

358:デフォルトの名無しさん
08/12/10 19:02:26
>>356
IRB.conf[:MAIN_CONTEXT].inspect_mode = false

>>357
どういうファイル名をどのように変えるのかがわからないとなんとも。
あと一行でっていうのは、やればできるんだろうけど
いわゆる玄人御用達だからオススメしない。

359:デフォルトの名無しさん
08/12/10 19:15:12
>>358
やってみましたが、かわんないです。
あいかわらず inspect の結果が表示されます。

360:デフォルトの名無しさん
08/12/10 19:21:59
ruby -i ky_*.txt -pe '$_.sub!(/麻生太郎/, "阿呆太郎")' *.txt

で動くかもしれない。

361:デフォルトの名無しさん
08/12/10 19:30:59
>>359
やりたいのは--noechoじゃない?
IRB.conf[:MAIN_CONTEXT].echo = false

362:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/10 21:24:33
>>361
びんごです!
さすが特務エスパー、多謝です

364:デフォルトの名無しさん
08/12/10 21:27:48
>>362
だからできるっつの
めんどくさいので、対象ファイルの指定も実際のコピーもRubyでやれ
これらを外部から読み込むように作ろうとすると敷居が微妙に高い
より正確に言うと変なものが混じったときのエラー処理がめんどい

365:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/11 15:36:25
>>366
ごめんなさい、これ勘違いだったので見なかったことに

368:デフォルトの名無しさん
08/12/11 15:37:11
>>365のスクリプトがキモい件について

369:デフォルトの名無しさん
08/12/11 15:50:06
Ruby式ではないな
他の言語の人間だ

370:デフォルトの名無しさん
08/12/11 16:19:31
初心者にあんま見せたくない書き方であることは間違いないね…

371:デフォルトの名無しさん
08/12/11 16:23:39
htmlデータからタグの間に挟まれた文字のみ取り出すにはどうすればいいですしようか。
タグ名もバラバラです。

<b1>殿様カエル</b1><b2>しり上がり</b2><goow>自転車</goow>

タグごと取り出す方法は分かったのですが。



372:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/11 16:41:37
>>371
hpricotとかでパースするのをオススメしたいけど
慣れるまでが難しいかも知れない。

ネスト構造無視でいいなら
str = "<b1>殿様カエル</b1><b2>しり上がり</b2><goow>自転車</goow>"
ary = []
str.gsub(/<.+?>(.+?)<\/.+?>/){ary << $1}

gsub使うのに違和感あるから、もっといい方法があるかも?

374:デフォルトの名無しさん
08/12/11 17:02:02
>>371
deleteの動作(主に返り値)に注意

str = "<b1>殿様カエル</b1><b2>しり上がり</b2><goow>自転車</goow>"
arr = str.split(/<.+?>/)
arr.delete('')
puts arr

殿様カエル
しり上がり
自転車


HTMLとしてパースするのが真っ当

375:デフォルトの名無しさん
08/12/11 17:09:31
>deleteの動作
そういえばなんでArrayの一部メソッドは破壊的な操作をするのに
!がついてないんだろう。perl由来の名残のような気もするけど

ary = [].push data
[].push! data
と書きそうになることがよくある。

376:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/11 17:47:42
>>376
継続とかcall/ccとかコルーチンとかだっけ。

require 'generator'
g = Generator.new([1,2,3])
g.next

380:デフォルトの名無しさん
08/12/11 17:50:28
外部イテレータ ね

381:デフォルトの名無しさん
08/12/11 18:02:39
>>375
!は「破壊的」という意味ではない。
!の意味は、それが付かない同名メソッドと比較して、注意すべき挙動の違いがある、という意味。

382:デフォルトの名無しさん
08/12/11 18:17:24
>>381
二種類提供する場合のみってことか。サンクス。

URLリンク(shugo.net)
>破壊的なメソッドと非破壊的なメソッドの両方を提供する場合、
>破壊的なメソッドには`!'を付ける。

URLリンク(www.ruby-lang.org)
>同名のメソッドがあって、一方はオブジェクトのコピーを作って返し、
>もう一方は変更されたオブジェクトを返すようになっている場合、
>!のついた方が破壊的メソッドです。ただし、!がつかないメソッドの中にも
>String#concatのように破壊的なものはあります。

383:デフォルトの名無しさん
08/12/11 18:52:51
>>365
ありがとうございます。
Rubyは初心者ですが、頑張って使いこなせるようになりたいです。

384:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/11 19:59:40
質問です。
Rateというクラスをインスタンスにして配列にしたいのですが、
@rates = Array.new(Rate.new)
と書くと、
can't convert Rate into Integer
というエラーメッセージが帰ってきて配列に出来ません。
どのようにすれば、インスタンス化したクラスを配列に出来るのでしょうか?

386:デフォルトの名無しさん
08/12/11 20:04:42
>>385
URLリンク(www.ruby-lang.org)
newの第一引数は整数か配列。

というわけで
@rates = [ Rate.new ]

387:デフォルトの名無しさん
08/12/11 20:06:10
>>384
$は文字列末尾じゃないぞ。

388:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/11 20:20:23
>>388
[1,2,3,4].zip(["A","B"]).map{|i| i.reverse}


390:385
08/12/11 20:25:26
>>386
ありがとうございます!

391:デフォルトの名無しさん
08/12/11 21:18:17
Ruby の作成環境の表示文字エンコードってどれが一番多いかな?
やっぱまだ EUC-JP? サンプルの日本語の puts のデフォルトを UTF-8 にしたいんだけど…

392:デフォルトの名無しさん
08/12/11 21:36:58
Windows環境でShift-JISの俺に隙はなかった

本当、端末の文字コード何とかならないかな
文字化けが不便なためにrspecのit 〜を日本語で書けない

393:デフォルトの名無しさん
08/12/11 21:52:54
# HTMLのタイトルを表示
puts html.scan(/<title>(.+?)</title>/)

では不足なんだよね
このあとに .toeuc とか .toutf8 とか書かないと化ける
化けるならまだしも、変なエスケープシーケンスがどうたらで方向キーとかが動作しなくなる
端末リセットしても直りゃしねえ

394:デフォルトの名無しさん
08/12/11 21:53:59
>>374
>>373
ありがとうございます。

split(/<.+?>/) の前にgsub(/<[^\/].[^>]*>/,"")をかませたらいい感じになりました。
splitの指定が正規表現できるとは初めて知りました。

395:デフォルトの名無しさん
08/12/11 21:54:45
そのへんは端末エミュレータの仕事だとも思う
日本語EUCでもUTF-8でも半角2バイト文字でもてきとーに表示するのが端末の仕事だろ
一緒に化けてどうする

396:デフォルトの名無しさん
08/12/11 22:41:16
>>395
無茶言うなよ……。一度エンコーディング自動識別のコード書いてみろ、絶望的な気分に浸れるから。

397:デフォルトの名無しさん
08/12/11 22:47:01
hoge.rb|nkf -Lu -wとか

398:デフォルトの名無しさん
08/12/11 22:50:00
>>393
inspectでお茶濁していいんじゃない?
どのみちその程度の文字コード知識はないとHTMLなんて扱えないから
説明が必要になるでしょ。

399:デフォルトの名無しさん
08/12/11 22:56:38
別に普通に書けたけどな。
JIS, SJIS, EUC-JP, UTF16 自動認識。

400:デフォルトの名無しさん
08/12/11 23:01:48
端末エミュレータが自動で標準出力に nkf -端末エンコード をかませばいいじゃん
nkf 自動認識が失敗したらなにか出力バッファに対して再試行できる仕組みにしてさ
Emacs が 文字コード指定して開き直せるのと同じような感じで

こういうときは us-ascii で済んでる人間が憎いなあ

401:デフォルトの名無しさん
08/12/11 23:21:56
>>399
どんなデータでもその自動認識が正しく動作するならおまえは天才だ

402:デフォルトの名無しさん
08/12/12 01:25:25
>>389
ありがとうございます。
でもこの場合、引数のほうが長ければ>>389のようにする、ということですよね。
そういうのが面倒だったので、zipにオプションがないかなーと思って質問してみました。
ないようならあきらめて>>389のようにします。

403:デフォルトの名無しさん
08/12/12 02:19:09
>>402
先頭の要素が不足する配列って、明示的にnil入れてあることが多いしね。

zipが複数の配列を引数に取ることを思い出して作り替えてみた。
眠いから間違ってるかも。

def Array.zip2(*ary)
 size = ary.map{|i| i.length}.max
 top = ary.shift.dup
 top[size-1] = nil
 if block_givin?
  top.zip(*ary){|a| yield a}
 else
  top.zip(*ary)
 end
end


404:デフォルトの名無しさん
08/12/12 02:31:14
>def Array.zip2(*ary)
やっぱ間違ってた、self使ってないorz
def zip2(*ary)ということでひとつ・・・。

405:デフォルトの名無しさん
08/12/12 02:36:23
配列の全内容を変数(String)に入れる簡単な方法はありますか?。
gsubの結果を1つの変数にまとめてgsubにかけようとしたら、

aa = bb.scan(/.+/)
*as = aa
cc = as.gsub(/m/,"")

こんな感じにしても「配列Array」だといわれてエラーで止まってしまいました。

406:デフォルトの名無しさん
08/12/12 02:37:05
訂正
scanの結果を1つの変数にまとめてgsubにかけようとしたら、

407:デフォルトの名無しさん
08/12/12 03:16:27
to_s

408:デフォルトの名無しさん
08/12/12 07:11:21
>>405
joinでいいような。
['aaa', 'bbb', 'ccc'].join #=> "aaabbbccc"

409:デフォルトの名無しさん
08/12/12 07:12:17
to_sは1.9系からinspectっぽくなるからおすすめしない。

410:デフォルトの名無しさん
08/12/12 07:37:25
ブロックの存在忘れ去られている scan (´・ω・) カワイソス

aa = bb.scan(/.+/){|match| match.gsub(/m/,"")}

411:デフォルトの名無しさん
08/12/12 12:39:25
tDiaryとHikiを使ってるんですけど、これはRuby1.9に対応していますか。

412:デフォルトの名無しさん
08/12/12 12:59:52
Ruby1.9はまだ使わないでください。

413:デフォルトの名無しさん
08/12/12 13:04:54
エラーが出ても自力で対処できないしな…
Ruby側が修正されるかライブラリ側が修正されるかするまで全く動作しないとかいうのは
ただ利用したいだけの一般ユーザーの身ではやってられん

が、開発とか覗いてみたいなーと考えてる人なら、1.9上で動かしてみてエラーのレポートとかしてみるといいかも
1ヶ月くらいじーっとROMってれば雰囲気はわかるしさ

414:デフォルトの名無しさん
08/12/12 13:05:51
>>412
いやいや、rc2なんだから使ってもらうべきだろ。


415:デフォルトの名無しさん
08/12/12 13:06:24
>>405
一つの変数には一つのオブジェクトしか入れられない。
だから複数のオブジェクトを入れられるArrayオブジェクトを器にするか
結合して一つのStringオブジェクトにするしかない(>>408)。

gsubしたあとにまたバラバラの文字列である必要があるなら
結合すると分割がめんどうだから
aa = bb.scan(/.+/)
cc = aa.map{|s| s.gsub(/m/,"")}
で配列の各要素に対してgsubをする。
やってることは結果的に>>410と同じだけど、Array#map(Enumerable.map)は
覚えておいて損はない。

416:デフォルトの名無しさん
08/12/12 13:19:55
>>414
お前のような奴がいるからFirefoxは

417:デフォルトの名無しさん
08/12/12 13:22:09
Rubyはバグ報告サポートがまだヘナチョコだからなー
SEGVが出た時点でエラー情報送信ウィンドウが出るくらいじゃないと開発者以外に勧めたらあかんと思う

418:デフォルトの名無しさん
08/12/12 13:35:43
一般ユーザーは偶数安定バージョンの2.0待ちが無難だよ。

419:デフォルトの名無しさん
08/12/12 13:59:05
>>417
dumb端末で使ってるやつもいるんだぞ!

420:デフォルトの名無しさん
08/12/12 14:03:05
>>419
本当? ふつう端末エミュレータかコンソールじゃないの?
今どきシリアル端末なんて管理者だって使わないだろ。

つうか vt100 だって、ダム端じゃねーぞ。

421:デフォルトの名無しさん
08/12/12 14:10:07
cursesが動かない環境はとりあえず切り捨てていい
そんなの使ってる人は自力で何とかすると思われ

422:デフォルトの名無しさん
08/12/12 15:56:53
「44133」を「12時間15分33秒」(の表示に必要な数値)に直してくれるライブラリとかないですかね

423:デフォルトの名無しさん
08/12/12 16:09:20
>>422
標準でありそうだが、ないな
というか時間オブジェクトってないよね
Time::Period クラスとかになるのかな

424:デフォルトの名無しさん
08/12/12 16:16:30
>>422
難しく考えなくても、Time.at(44133)のTimeオブジェクトからhms拾えばおk。

425:デフォルトの名無しさん
08/12/12 16:21:13
あ、タイムゾーン影響を受けるからTime#utcを忘れずに。

426:デフォルトの名無しさん
08/12/12 16:23:19
こんな感じかな?
Time.at(44133).getgm.strftime("%H:%M:%S")

427:デフォルトの名無しさん
08/12/12 16:40:14
24時間を超えたらどうすんの。

428:デフォルトの名無しさん
08/12/12 16:51:05
>>427
どうしようもないな
日の部分が1を超すかどうかをチェックするしかあんめえ

429:デフォルトの名無しさん
08/12/12 16:54:14
そうなると秒数を割り算したほうがわかりやすそうだ

430:デフォルトの名無しさん
08/12/12 16:57:59
>>407
>>408
>>410
joinで解決しました。ありがとうございます。
aa = bb.scan(/.+/){|match| match.gsub(/m/,"")} もいいですが、今一ブロック処理って理解しきれない部分があって。



431:デフォルトの名無しさん
08/12/12 17:02:03
>>415
勉強してみます。ありがとうございます。

432:デフォルトの名無しさん
08/12/12 19:18:43
あるオブジェクトのインスタンス変数に File オブジェクトがセットされてるとして、
そのオブジェクトが GC されるタイミングでその File オブジェクトは close される?

433:デフォルトの名無しさん
08/12/12 19:22:38
あ、それで、もし close されてくれないとして、その場合に、
GC のタイミングで close する
finalizer のようなことをする方法があれば教えてください。

434:デフォルトの名無しさん
08/12/12 19:30:47
>>432
URLリンク(www.ruby-lang.org)
> 参照されなくなったFileオブジェクトは、GCで自動的にクローズされます

>>433
URLリンク(blade.nagaokaut.ac.jp)

require 'finalize'
Finalizer.add(obj)
でobjがGCされるときにobj.finalizeがコールされる

はずだけど使ったこと無いw

435:デフォルトの名無しさん
08/12/12 19:37:48
忘れてた。これも参照のこと。
URLリンク(www.ruby-lang.org)

それと「objがGCされたとき」にobj.finalizeを呼ぶことはできないのか。
Finalizer.add(file, obj)


436:デフォルトの名無しさん
08/12/12 19:48:00
>>434 >>435
ありがとうございます。
明示的に close しないのはあまり行儀が良くないとは思いますが、
それほど扱うファイルが多くない場合には GC に期待しても良さそうですかね。
Finalizer はリファレンスマニュアルに説明が無いですが、
これは使うなという無言の圧力でしょうか・・・

437:デフォルトの名無しさん
08/12/12 19:50:26
いや、明示的に閉じろよ
なんでこの機能に依存するんだよ

438:デフォルトの名無しさん
08/12/12 20:00:19
「ガベコレされる時のフック」はいろいろとヤバい代物だから、
使うのは本当に必要なとき(ってどんなときだろ)のみにすべき。

ファイルのクローズのような処理はガベコレに頼るべきではない。

439:デフォルトの名無しさん
08/12/12 20:19:45
ガベージコレクションはプログラム作成者が意識したらダメよ
いい意味でも悪い意味でもな
オブジェクトの自動回収だけをさせるべき

440:デフォルトの名無しさん
08/12/12 20:28:12
>>437 >>438
自分が一から設計するならそうしたいんですけどね。

hash_table.delete obj

みたいなコードがあって、今まで obj はメモリ内で完結するオブジェクトでしたが、
あるとき機能追加で File を持つ obj も扱うようになりました。
これを真面目に close するとすると delete する直前の箇所で、

obj.close if obj.respond_to? :close
hash_table.delete obj

としたり、 hash_table の初期化をする箇所で

class << hash_table = Hash.new
alias :__delete :delete
def delete obj
obj.close if obj.respond_to? :close
self.__delete obj
end
end
...
hash_table.delete obj

と hash_table を拡張するのは思い付いたんですが、
hash_table 側のコードを変更するよりは、
機能追加する側の obj の方でどうにか (あわよくば GC で勝手に) close できれば
そっちの方が変更としてはスマートかな、と思いました。

何か良い方法ありますかね?

441:デフォルトの名無しさん
08/12/12 20:31:31
いや、だから、openが終わったときにcloseするか、ユーザーのcloseを受け付けるように作れよ

442:デフォルトの名無しさん
08/12/12 20:42:56
Fileオブジェクトを使う人が、そのファイルオブジェクトの責任を持つ

ということで、この場合は勝手に消していいと思う
obj.open だけして放置する人がいたのなら、それはその人が悪いんじゃないかな

443:デフォルトの名無しさん
08/12/12 20:48:32
ど田舎富山DQN男の家族消えろ ど田舎富山DQN男の親消えろ ど田舎富山DQN男の子供消えろ ど田舎富山DQN男の親戚消えろ
ど田舎富山DQN男の家族消えろ ど田舎富山DQN男の親消えろ ど田舎富山DQN男の子供消えろ ど田舎富山DQN男の親戚消えろ
ど田舎富山DQN男の家族消えろ ど田舎富山DQN男の親消えろ ど田舎富山DQN男の子供消えろ ど田舎富山DQN男の親戚消えろ
ど田舎富山DQN男の家族消えろ ど田舎富山DQN男の親消えろ ど田舎富山DQN男の子供消えろ ど田舎富山DQN男の親戚消えろ
ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・)
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
死ぬとき このレスの事思い出してから地獄へ行けよ
ニヤ(・∀・)ニヤ(・∀・)



次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4400日前に更新/244 KB
担当:undef