[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/16 09:04 / Filesize : 244 KB / Number-of Response : 847
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 23



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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

463 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 13:37:05 ]
strscanらぶ

464 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 13:42:35 ]
>>458
今ならERbよりErubisの方が良くないか?

>>459
まず、erubyのインストールが厄介なのでは

465 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 14:00:56 ]
各行の先頭に連番を振ることはできませんか。
「行数=挿入する数字」で良いんですが。

466 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 14:01:26 ]
あのへんはサーバ上で動かすための設定やインストールが面倒でなあ…
ローカルでスクリプトとして使うならそれほどでもないんだが

467 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 14:03:07 ]
>>465
各行に対して、正規表現の文頭を数字で置換しれ
改行区切りで配列にしてしまうのが簡単だと思う
joinでくっつけるときの改行コードは元の改行にしておくこと

468 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 14:09:35 ]
str = "a
bb
ccc
dddd"
lines = Array.new
str.to_a.each_with_index do |e, n|
lines.push(e.sub(/^/){"#{n+1}: "})
end
print lines.join


結果

1: a
2: bb
3: ccc
4: dddd

このまま使うと2桁3桁のとき数字表示が汚くなるが、そのへんは自分で考えれ

469 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 17:17:48 ]
>>467>>468
親切にありがとうございます。

>各行に対して、正規表現の文頭を数字で置換しれ

これはよく分かるのですが、

>改行区切りで配列にしてしまうのが簡単だと思う

というのがよくわからないのです。

str="●●●"の●●●の部分に連番を振りたいファイルの内容を
全部コピーして貼り付けて実行すれば良い、ということなのでしょうか?
確かにそれなら実現できました。

ただ、手間がかかるので
連番を振りたいファイルを指定して、
中身を直接書き換えられれば有難いのです。
そのような方法はありませんでしょうか。

ひょっとして初心者丸出しの質問なのかもしれませんが、
御教示頂ければ幸いです。

470 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 17:46:04 ]
プログラミングとクラスの考え方がまだ身についてないっぽい
必要なのはString オブジェクトだ
つまり文字列

ファイルパスを指定するとファイル内容を文字列で返すメソッドを持つクラスがあるからそれ使え
ファイル内容を文字列で取得できたら文字列内を置換しれ
んで書き込みたい文字列を作れたら、同じ名前でファイルに書き込め

471 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 18:02:44 ]
・ スクリプト内の変数の文字列を置換する
・ スクリプト内で指定したファイル内容を読み込んで表示してみる
・ 読み込んだファイル内容を置換して表示してみる
・ 置換した内容を別ファイル名で保存してみる
・ あらかじめ元ファイルをバックアップしておき、置換した内容を元と同じ名前で保存してみる
・ あるフォルダ(ディレクトリ)のファイル一覧を取得して表示してみる
・ 自分の欲しいファイル名だけを抽出する方法を考えてみる
・ 一覧のひとつひとつに対してファイル名だけを表示させてみる
・ ファイル名の表示の部分を「ファイル内容を読み込んで表示」に切り替えてみる
・ 「ファイル内容を読み込んで表示」の部分を「読み込んで置換して同名で保存」に置き換える

こんな感じ?



472 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 18:03:47 ]
> ・ スクリプト内で指定したファイル内容を読み込んで表示してみる
スクリプト内で指定したファイル名の内容を読み込んで表示してみる、だった

473 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 18:10:45 ]
問題を「これならできそう」って思える程度に分割する能力って大切だよね
オライリーはPragmatic Thinkingなんちゃらって本の日本語版出せばいいのに

474 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 18:28:21 ]
>>471みたいなのは、現状、意識的に経験積むしかないんだよね
うまい本とかあればいいんだけど、あんまり聞かないな

475 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 18:33:15 ]
>>471
そんな感じです。お手数をかけてすみません。
それを参考にして一つ一つ覚えて行きたいと思います。

何度か他の言語を覚えようとして挫折したのですが、
Rubyは簡単に結果を出力できて感動したので、
この言語を勉強することにしました。
(プログラムは素人ですが、
 Rubyのコードがシンプルで美しいと思ったのも動機の一つです)

一応「たのしいRuby」と「Rubyレシピブック」は購入しましたので、
今は「15.2 基本的な入出力操作」を試しています。
プログラムとかはやったことはないのですが、頑張って覚えるつもりです。

476 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 18:37:33 ]
すると

File.open(path, 'r'){|f| puts f.read}

ができた頃かね
f.read が文字列を返してることがわかったら、ファイルひとつを置換するのはもうすぐだな

477 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 22:18:03 ]
ワンライナーだと
ruby -pe "printf '%4d ',$." ファイル名
でファイルに4桁の行番号をつけて標準出力に表示

ファイルを書き換えたければ -i.bak などと-i オプションにバックアップの拡張子をつけて実行
ruby -i.bak -pe "printf '%4d ',$." ファイル名

標準入力から読み込んだ場合の行番号は$.に入ってる、行番号の形式を変えたければprintfを勉強する
複数のファイルを指定しても大丈夫

Windowsだと -i の拡張子無しでの直接書き換えが出来ないのがちょっとやだな
UNIXだと ファイル開いておいて、開いたファイルを削除して、書き込み用で同名のファイルを作成するのかな?
PerlでもWindowsだと出来ないので、同じような動作してるんでしょうね
というか、Perlの動作を再現してるんでしょうけど


478 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 22:25:44 ]
path = 'test.txt' #適当に作っといてね
outfile = 'testwrite.txt' #問答無用で上書きされるぞ
と、すると
pathファイルを開いて、全体を一気に読み込んだものを表示する
open(path, 'r'){|f| puts f.read}
pathファイルを開いて、一行読み込んで表示するのを最後まで繰り返す
open(path, 'r'){|f| f.each{|line| puts line}}
pathファイルを開いて、一行読み込んで、行番号表示して、行の内容を表示するのを最後まで繰り返す
open(path, 'r'){|f| f.each_with_index{|line,ind| printf '%3d ',ind+1;puts line}}
pathファイルを開いて、書き込み用のoutfileファイルも開いて、一行読み込んで、ファイルに行番号書き込んでから行の内容も書き込むのを最後まで繰り返す
open(path, 'r'){|f| open(outfile,'w'){|out| f.each_with_index{|line,ind| out.printf '%3d ',ind+1;out.puts line}}}


479 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 22:30:00 ]
cat -n

480 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 22:32:30 ]
>>479
そんなこと言ったら行番号付加ツールインストールすれば一発だぞ

481 名前:デフォルトの名無しさん [2008/12/13(土) 23:42:38 ]
$.




482 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 01:44:40 ]
>>476
お恥ずかしながら io.readlines のことかと思って悪戦苦闘していました。
例文通りに打ち込んでも上手く行かないので、何かプログラムの根本的な
ところが判ってないのだと思って再び悩んでいました。

>>477
>>478
ありがとうございます。おかげさまで希望通りの動作が実現しました。
教えて君のような私にここまでして頂いて何と感謝すれば良いのか判りません。
私に何ができるわけでもありませんが、似たようなことがあったら、
私もこのスレの皆さんのような態度で困った人に接したいと思います。
このスレの皆様に心から感謝します。本当にありがとうございました。

483 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 03:03:55 ]
馬鹿なの?
死ぬの?

484 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 05:12:40 ]
>>482
たかが2chでそこまでバカ丁寧になる必要はない
教えてやりたい人間が教えたいように教えただけ

>>483
バカ丁寧だから、バカなんじゃない?

485 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 05:13:18 ]
ああ忘れてた、>>477-478, 乙であります

486 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 05:40:39 ]
>>484
たかが2chで「必要がない」ことをそんな大きく見てもしょうがない。
他の多くのレスの不必要な表現と同じように、>>482も書きたいように書いただけ。

487 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 12:37:57 ]
>>455
ないみたいね
そもそもPlaggerのスレさえも立ってない
(理由は不明だけど、俺は人気がないんだと思っている)

話したいなら、ここや本スレでも良いと思うよ

488 名前:デフォルトの名無しさん [2008/12/14(日) 12:47:00 ]
ruby-ldapのインストール方法について質問です。
OSはcentos5.2を使用して
ruby本体は、 ruby-1.8.6-p287をcheckinstallにてRPM化しインストールしています。
ruby-ldap-0.9.7-1.i386.rpmを入手して、インストールを試みたところ下記のような
エラーメッセージが出力されて、二日ほど止まりっぱなしです。
どなたかアドバイスをお願いします。

# rpm -ivh ./ruby-ldap-0.9.7-1.i386.rpm
警告: ./ruby-ldap-0.9.7-1.i386.rpm: ヘッダ V3 DSA signature: NOKEY, key ID bfbaf0e8
エラー: 依存性の欠如:
libcrypto.so.5 は ruby-ldap-0.9.7-1.i386 に必要とされています
libruby.so.1.8 は ruby-ldap-0.9.7-1.i386 に必要とされています
libssl.so.5 は ruby-ldap-0.9.7-1.i386 に必要とされています
#


489 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 13:03:15 ]
>>488
ruby-dev のようなもの、libopenssl-ruby のようなもの、openssl のようなもの、のインストールが足りない
Ruby関係ないな

490 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 13:13:04 ]
rpm コマンドの使い方の話だね
必要なファイルを含むパッケージを表示する方法があるはずだから、それでインストールするパッケージを調べるといい

491 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 13:49:11 ]
>>489-490
ruby-devとlibopenssl-rubyについては入っていません。。
ruby-dev`については、自ら作成したrubyのRPMファイルを入れるときに
アンインストールしちゃいました。
含んでいそうなファイルを探してみます。
ありがとうございました。



492 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 13:53:01 ]
devは作るときのだから、バイナリを入れるだけならなくても大丈夫だと思う。


493 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 14:51:23 ]
結局、
# rpm -qa | grep ruby
ruby-irb-1.8.6.287-1.el5.kb.1
ruby-libs-1.8.6.287-1.el5.kb.1
ruby-1.8.6.287-1.el5.kb.1
ruby-devel-1.8.6.287-1.el5.kb.1
こんな感じに拾ってきたrpmを入れてから、
#rpmbuild -ta ruby-ldap-0.9.7.tar.gz
を実行して、自分でrpmファイルを作ったら、インストールできました。

この状態だとgemが入れられなかったので、rubyのrpmファイルを自前で作成して
インストール後、上記の状態にしたのでgemがどっかで不具合を起こさないか不安ですけど。
ちなみに、gemがインストールできないのはrdocがロードできないとか怒られた。
rdocのrpmファイルってどこかに落ちてるんでしょうか?

494 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 14:56:39 ]
ディストリビューションオフィシャルリポジトリの存在を無視するな

495 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 20:54:03 ]
関連付けでファイルを開きたいのですが、
どうすればいいでしょうか。

 path ="test.txt"
 system("start path")

これだとコマンドプロンプトが立ち上がるだけで
関連付けでファイルを開いてくれません。

496 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 21:01:50 ]
コマンドラインから「start path」という9文字を入力してEnterしてみ
それと同じことが起きてるだけ

497 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 21:03:03 ]
system("start #{path}")

498 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 21:43:35 ]
>>497
出来ました! ありがとうございます。 m(_ _)m

499 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 22:13:54 ]
あと10日で1.9正式リリースなわけだが大丈夫なの?
1.9向けにライブラリ作っていい?

500 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 22:26:51 ]










るなら作ってみな

という感じだ
特にEncode関連

501 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 22:29:24 ]
文法エラーが出なくなる程度の対応は進めてもらえると
いちユーザーとしてもいきなり挫折しなくて済んでいいかも

ruby1.9 ./hoge.rb

しただけで普段見たことも無いファイルのやたら多い行数のとこでSyntaxErroroとか挫けるし



502 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 22:30:51 ]
>>499
1月に延期されたとかなんとか

503 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 22:32:38 ]
1.9に自作ライブラリを対応させるためのHOWTOとかそういう文書ってある?
1.9.0 features を読んで逐一チェックするしかない?

504 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 22:51:10 ]
>>499
12月25日に予定されてるのは、1.9.1のRC(リリース候補)で正式版じゃない
といっても、現時点でもう1.9.1の仕様は固まってるはずなので、今から作り始めても良いと思うが

505 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 22:51:59 ]
>>503
たぶんrubikitichがホッテントリ狙って書くよ。

506 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 22:58:22 ]
ぬう

507 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 23:10:00 ]
下の文字列がなぜ文字化けするのですが、何が原因でしょうか。

$KCODE="s"
tut = "12月28日 夢見師(プリンセスソフト、7,140円) "
p tut

508 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 23:13:46 ]
s?

509 名前:デフォルトの名無しさん [2008/12/14(日) 23:14:57 ]
すいません、

#!/usr/local/bin/ruby -Ks
の1行入れてなかったことによるものでした。お騒がせしてすいません。
>>508
sjisのことです。

510 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 23:49:31 ]
やっぱり詰まった...。
以下a1の文字列の内()とその中身を消したいのですが、
なぜか ) だけ残して全て消えてしまいます。

#!/usr/local/bin/ruby -Ks
$KCODE="s"
a1="最強 東大将棋6(毎日コミュニケーションズ、2,940円) "
a1 = a1.gsub(/.*?月.*?日 /,"")
a1 = a1.gsub(/(.*?円)/,"")
p a1

511 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 23:53:36 ]
正規表現中のカッコは特別な意味を持つメタ文字だよ
正規表現中でカッコそのものを表すなら \( や \) のようにエスケープしなきゃだめ



512 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 01:03:05 ]
>>511
え゛っ、そうなんですか!!
/に\/しなきゃならないのは知っていたですが、()もでしたか。
他でもポカしてそうだな。
ご解答ありがとうございます。

513 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 01:04:30 ]
>512
英数はそのまま書くとその文字、\を付けると特別な意味になることが多い。
逆に記号はそのまま書くと特別な意味があることが多く、\を付けるとその文字ってことが多い。

514 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 01:41:29 ]
てかマニュアルに全部書いてあるんだからきちんと読め
記号の意味そのものは必要なときに調べればいいから覚えなくてよし
エスケープが必要な文字かどうかだけを記憶すればおk

515 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 09:11:03 ]
ピリオドも意味もってるんだけど
間違ってエスケープせずにピリオド使ってても
そのまま動いてしまって気付かないことが多い

あとで忘れた頃に問題が表面化するから初心者は注意な

516 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 09:54:50 ]
image_paths = filepaths.find_all{|e| /.jpg\Z/ =~ e}

で99.99%くらいは普通に動作するんだよな

517 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 10:02:26 ]
正規表現の粒度をどれくらいにするかというのは永遠の問題
わかってない人が「メールアドレスにヒットする正規表現を書け」とか課題出したりするんだが

518 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 10:27:14 ]
"(a)"
から
/\s*\(a\)\s*/
を生成するのってどうやるんですか?
a = "(a)"
/\s*#{a.escape}\s*/
みたいに書ければいいんだけど

519 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 10:41:09 ]
>>518
マニュアル読んどけ
Rubyの正規表現はただのオブジェクトだからRegexpクラスのメソッドで生成できる
/〜/ で書くのはただのわかりやすいエイリアスに過ぎない

あと、半角スペースと \s には直接の関係はないから、あらかじめ \s で書いておくしかないよ
個人的には半角スペースを \s で表現するようにするのは後々罠に落ちるから全くお勧めしない
半角スペースがあるのなら、どんなに正規表現の見かけがマヌケになっても半角スペースで書くべき

520 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 11:10:37 ]
>>518
/\s*#{Regexp.escape(a)}\s*/
Regexp.quoteという別名も。

521 名前:455 mailto:sage [2008/12/15(月) 21:43:26 ]
>>487
あんちゃん、ありがとう。
せつこ、このスレで日本一のpragger目指すんよ。



522 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 21:57:53 ]
技術的には便利だけど、他のことで代替できるよね、という微妙な立ち位置がどうにも…
プラガブルであることのメリットがイマイチ生かされてないんだな

523 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 05:42:09 ]
www.google.co.jp/trends?q=PHP%2Cruby&ctab=0&geo=US&geor=all&date=all&sort=0

逆転しそう

524 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 05:46:15 ]
www.tiobe.com/index.php/content/paperinfo/tpci/index.html

逆転もなにも、世界的には10位以下に後退したダメダメ言語だけどね
(ただ、Pythonが下がってたりLogoが爆上げしてるところから見ても
かなり変な順位づけであることは間違いない)

525 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 19:07:50 ]
D:/desktop にある、

 001test.txt
 002test.txt
 003test.txt

という複数のファイルを、
数字の部分に正規表現を使ったパスで一度に開きたいのですが、
どうすれば良いでしょうか?
次のように書いているのですが上手く行きません。

files = /D:/desktop/[0-9]+test.txt/
 system("start #{files}")


526 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 19:21:31 ]
リファレンスマニュアルの正規表現のとこ読め
あと %r の使い方も調べとけ

527 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 19:24:19 ]
よく見たら正規表現関係無いじゃないか
Dir.glob

528 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 21:05:12 ]
>>527
御返事ありがとうございます。
それで調べたら Dir.glob は正規表現ではなくワイルドカード対応と書いてあるのですが、
これは正規表現には対応していないということではないでしょうか。

>>525の書き込みはあくまで勉強中の実験のものなので、
実際に使う時にはパスを正規表現で指定したいのです。

また、>>525では省略しましたが、
開きたいファイルは似たような名前が多いので、最終的には、

name = ●●
files = %r("D:/desktop/[-9]+●●.txt")
 system("start #{files}")

というような形にして、●●の部分を書き換えるだけで
任意のの複数のファイルを開けるようにしたいのです。

529 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 21:28:50 ]
>>528
そういうのだと全ファイル名から正規表現でselectせざるをえないかな。


530 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 21:50:09 ]
Rubyではselectはあまり使わない
find_all と呼ぶ

531 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 21:59:18 ]
>>528
まったく同じことを繰り返すことになるが、Rubyのオブジェクトについての考え方学んでくれ
返り値がただの文字列なら、それはただの文字列(String クラスのオブジェクト)で、何か特別なものがあるわけじゃない
Stringクラスのメソッドが完全に全て動作するし、文字列オブジェクトを引数にとるメソッドは全て完全に動作する
メソッドの返り値がどのクラスのオブジェクトなのかということは絶対に意識しないと駄目よ

正規表現を使いたいなら、引数…、まあ、引数の見かけしてないことが多いけど、マッチ試行対象は文字列だ
いちばん単純な状態で必要なのは、ディレクトリ中のファイルを文字列で返すメソッド
その文字列の一群の中から、正規表現にマッチする文字列を探して、その文字列をどうにかすればいい



532 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 21:59:19 ]
>>530
ソースは?

533 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 22:43:20 ]
target = 'D:/desktop/*'
filter = /\d+test.txt/
system(Dir.glob(target).select{|i| i =~ filter}.unshift('start').join(' '))

534 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 00:24:48 ]
>>533
なあ、初心者スレなんだから、もっと分かりやすく書こうぜ

filenames = Dir.glob('D:/desktop/*')
filenames = filenames.grep(/^¥d+test¥.txt$/)
system "start #{filenames.join(' ')}"



535 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 00:34:21 ]
>>534
改行が存在しない文字列に対して ^ と $ は不適
代わりに \A と \Z を使おう

536 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 00:43:57 ]
どなたかアドバイスください。ruby1.8.7です。

require 'tk' がうまく いきません。以下のようなメッセージが表示されます。
in `require' : no such file to load --tk (LoadError)

どうすればいいでしょうか?


537 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 00:46:52 ]
>>536
Tcl/Tkが入ってないんじゃね?

538 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 00:48:23 ]
>>536
tkライブラリを見つけられなかった。

tkがインストールされない環境(ってなんだろ?)か
$LOAD_PATHがおかしいんじゃない?

539 名前:536 mailto:sage [2008/12/17(水) 01:02:12 ]
sudo find / -name tk で検索したところ

/usr/local/lib/ruby/1.8/test/unit/ui/tk
/usr/lib/ruby/1.8/test/unit/ui/tk

が見つかったんですけどこれとは違うんでしょうか?
ちなみに echo $LOAD_PATHでは何も表示されませんでした。

540 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 01:13:10 ]
>>534
質問者の求める「正規表現の使えるglob」が提供されて無いから別解を提示しただけ
分かりにくいってのはわざとそうしてるんだから許してよ

>>539
それ違う
OS何?tcl/tk入ってる?wishコマンド使える?

541 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 08:10:32 ]
>>535
>改行が存在しない文字列に対して ^ と $ は不適
逆だろ。改行が存在しない文字列だからこそ ^ や $ を使っても構わない。





542 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 08:13:15 ]
>>540
>分かりにくいってのはわざとそうしてるんだから許してよ
なんでそんなことをするの
分かりやすく書けないのをごまかしてるだけじゃねーのかよ

543 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 08:22:36 ]
>>541
あまりRubyの正規表現に詳しくない人間が見たら
「ああ^と$は文字列先頭と末尾なんだな。Perlと同じなんだな」とか
勘違いしちゃうよ

544 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 08:44:02 ]
>>534
>system "start #{filenames.join(' ')}"
system 'start', *filenames
でよくね?

545 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 10:21:20 ]
>>544
そんなこと言ったら2行目はメソッドチェーンで消えるし、
対象ディレクトリが専用ディレクトリならそもそも Dir.glob のワイルドカードつき文字列でも充分だ

君が *引数 をオボエタテだからだからといってわざわざ難しくする必要はない

546 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 10:28:48 ]
>>541
目に見えない文字や場所にマッチする正規表現は慎重に使ったほうがええぞ
半角空白にマッチさせるために \s を使ったりしないだろ
それと同じこと

547 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 10:30:19 ]
>>545
544じゃないけど、一般にsystemの引数は ' ' でjoinするより * で渡すほうが空白を含むファイル名等の問題をより安全に回避できるので、* のほうがお勧めだけどね

548 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 10:37:16 ]
*の引数展開はマニュアルでも辺鄙なとこにしか書いてないからな
使うなら堂々と初心者向け解説の3ページ目から使いまくるくらいの感じにして欲しいとは思う

549 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 10:45:05 ]
`
mkdir foo
mkdir bar
`

みたいに途中でシェルスクリプトだらだら書けるようなやり方ってない?
上の書き方だとmkdir fooだけ実行されるっぽい


550 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 10:49:19 ]
`` はシェルコマンドを実行したいときに使う記法じゃないぞ
返り値が必要なときに使うもんだ
system 使え

551 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 10:57:56 ]
>>544 >>547
やってみた?



552 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 11:17:32 ]
534です。
>>547
たいへん参考になりました。
ただ初心者スレで使うには説明が必要ですね。

553 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 11:21:00 ]
>>550
system "
mkdir foo
mkdir bar
"
でも変わらなかった

554 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 11:31:24 ]
>>553
シェルスクリプトとみなせる環境であるなら全部実行できるはず
動作しないとしたらWindowsかCygwinだな

555 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 11:33:20 ]
渡した文字列がshに渡るんだから
mkdir foo; mkdir bar だろう。

つーかそんなことしなくても、
mkdir foo bar でいいだろう。

556 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 11:35:50 ]
>>555
最新5レスしか読めない携帯からのご参加ですか?

557 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 11:38:56 ]
>>555
mkdir したいって話じゃねーだろ

>>553
Windowsではでっかいひとつのスクリプトとして実行するしかなさそうだな

558 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 11:39:43 ]
つーか、全部シェルスクリプトで書けば?
system "foo.sh"
したらいいやん

559 名前:540 mailto:sage [2008/12/17(水) 12:15:12 ]
>>542
初心者にはメソッドチェーンが読みにくいかもしれない、とは思ったけど
読み解くのも勉強になるだろうと思ってそのまま書いた
grep と system(*args) は知らなかったから書き直すよ

target = 'D:/desktop/*'
filter = /\d+test.txt/
command = 'start'
system(*Dir.glob(target).grep(filter).unshift(command))

560 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 14:15:15 ]
>>559
>system(*Dir.glob(target).grep(filter).unshift(command))
なぜわざわざunshiftを使うのか分からん。>>544の通りに
system command, *Dir.glob(target).grep(filter)
でええやん。

561 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 14:34:26 ]
すっごい前に、配列からの抽出にpopとshiftを使う子がスレにいたな
キューじゃないものに pop とか使ったらダメよ混乱するから



562 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 15:00:35 ]
>>530
RubyのselectはSQLのselectじゃなくて
Smallltalkのselectに由来するって知ってるか?


563 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 15:09:54 ]
>>561
普通に使ってるし、混乱するって話もあまり聞かないぞ
そもそもpopやshiftを使わないとすると、代わりにどんな風に書くんだ?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<244KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef