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


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

Ruby 初心者スレッド Part 24



1 名前: 【大吉】 mailto:sage [2009/01/01(木) 13:13:22 ]
プログラミング言語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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

596 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 02:33:58 ]
エラーになるURL晒すのが早いと思うが

597 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 04:34:23 ]
ネット系の問題に自分でデバックすら出来ないレベルか。なんか目的にたどり着くのは無理っぽい。


いつも使う必須のスクリプトが環境依存で引っ越して問題が出るのは良くある事。
まあその時に必要に迫られて書き直すと見通しよく成っていいプログラムに成る事は多いが。車輪の再生産気味だが。

598 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 06:11:08 ]
リファクタリングが車輪の再生産って言われるとやる気なくします><

599 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 06:25:09 ]
>>593
ステータスコードが200だからといって信頼していいわけじゃないぞ

600 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 08:21:46 ]
ruby 1.8.6 WindowsXP SP3です。

実例ではないのですが、100までの数をカウントするプログラムに、
標準入力から入力された数字を現在の数字に足す機能を加えたいと思っています。
色々調べたところ、スレッドというものを使えばよいのかな、という結論に達したので
以下のようなプログラムを書いてみましたが、思うような動作をしてくれません。
どなたかお知恵を貸していただけないでしょうか?

j = 1
t = Thread.new do
  while (j < 100)
    sleep 1
    p j.to_s
    j += 1
  end
end

while (j < 100)
  i = gets.chomp
  j += i.to_i
end


601 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 08:41:42 ]
これは・・・

602 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 08:45:58 ]
自然数k,p,q,m,nについて
k=mp+nq(m>=0,n>=0)を満たす(m,n)の組の数をv(k)とするとき
p=3, q=7, kが1から100までのときの結果vの一覧を出力したいです
Rubyではどのように書いたらいいですか?


603 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 08:53:52 ]
>>600
うちではうごいた

604 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 08:55:22 ]
>>602
m=0あるいはn=0のとき自然数じゃなくなるけどいいの?



605 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 08:58:43 ]
>>604
すみません間違えました
 x 自然数k,p,q,m,nについて
 o 自然数k,p,qについて
あと、m,nは「0以上の整数」です
よろしくおながいします

606 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 08:59:23 ]
>>603
うちでは数の表示がgets.chompに邪魔されて、リターンを押すまで
数え上げるほうのスレッドの実行がとまっているみたいなんです。

環境はLinuxとかでしょうか?

607 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 09:09:14 ]
>>606
cygwinです

608 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 09:10:44 ]
>>602
p = 3
q = 7
(1..100).each do |k|
 v = 0
 (0..(k/p)).each do |m|
  (0..((k-m*p)/q)).each do |n|
   if k == m*p + n*q
    v += 1
   end
  end
 end
 print "v(#{k})=#{v}\n"
end

609 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 09:20:36 ]
>>607
ありがとうございます。
実際にこの処理を使用するプログラムでは拡張ライブラリ使用&exerbでexe化を
考えています。Cygwinでは正常にexe化できないようなのでmswin32でなんとかならないか
もうちょっと調べてみます。

610 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 09:21:13 ]
>>600
mswin32ではgetsがブロックする。

611 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 09:27:05 ]
リファレンスのどっかにあったと思ってたんだけど、やっと見つけた。
www.ruby-lang.org/ja/man/html/trap_timeout.html

612 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 09:30:49 ]
>>608
こうかな
p = 3
q = 7
t = 0
u = 0
(1..100).each do |k|
 v = 0
 (0..(k/p)).each do |m|
  if (k-m*p)%q == 0
   v += 1
  end
 end
 print "v(#{k})=#{v}\n"
 u += v
 if v > 0
  t += 1
 end
end
print "total #{t}, #{u}\n"


613 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 09:41:30 ]
>>609
exerb+cygwinでexe化うまくいってるよ
なんか変なライブラリくっつけてない?

614 名前:デフォルトの名無しさん [2009/01/20(火) 09:59:05 ]
>>602
参考になるのかな
ttp://d.hatena.ne.jp/octech/20080118



615 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 10:09:17 ]
アンカミス
>>600

616 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 10:34:43 ]
>>614
ドンピシャです。ありがとうございます!

>>610-611
なるほど、mswin32だと修正を待つしかない・・・のかな?
と思ったけど回避策ってあるもんなんですね。引き出しを増やさなきゃ。

>>613
win32/sapi5を使っているのと、HDD容量に難があったのでCygwinは入れてませんでした。
2日前にHDDを注文したので届いたらCygwinでもやってみます。

レス下さった方々、ありがとうございました。

617 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 12:17:42 ]
>>616
>なるほど、mswin32だと修正を待つしかない・・・のかな?

バグじゃないから修正はされないんじゃないかな。
1.9では問題ないみたいだけど。

618 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 12:52:49 ]
>>608
共通一次ですね

619 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 12:54:26 ]
>>616
_kbhit入れたバージョンでも
一文字だけ入れてenterしないときって止まるよね

620 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 13:05:14 ]
>>617
バグじゃないんですかね?ruby-list 36068ではバグみたいに言われてる気がするけども。
1.9では問題ないとは!バージョンあげようかなぁ。

>>619
止まりますね。でも、そのほうが便利な気がしないでもないです、私の場合。

621 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 13:51:52 ]
>>614の方法だとキー入力するまでひたすらビジーループなんだが

622 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 15:42:40 ]
>>620
Windowsでselectがコンソールに対して効かないのは仕様だろう。
バグだと思うならMSに言ってみるのがいいんじゃないか。

623 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 19:56:56 ]
>>621
そんなことないですよ

624 名前:デフォルトの名無しさん [2009/01/20(火) 22:05:16 ]
h = {"direct"=>"5",
  :list=> {"6"=>"南西","7"=>"西","8"=>"北西","1"=>"北","2"=>"北東","3"=>"東","4"=>"南東","5"=>"南"}}
上のハッシュをh.ya2yaml すると
  direct: "5"
  ? !ruby/symbol list
  :
    ? "1"
    : 北
    ? "2"
    : 北東
    ? "3"
    : 東
    ? "4"
    : 南東
    ? "5"
    : 南
    ? "6"
    : 南西
    ? "7"
    : 西
    ? "8"
    : 北西
となるのですが、’?’はどういう意味ですか。
そもそも "8":北西 という感じで出力されると思っていたのですが,
期待と違った結果でした。
ruby 1.8.6 (2008-03-03 patchlevel 114)




625 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 22:48:19 ]
1.9っていつリリースされる予定なの?

626 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 01:17:39 ]
RC2出てから

627 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 02:00:38 ]
>>626
知らないなら答えきゃいいじゃん

628 名前:デフォルトの名無しさん [2009/01/21(水) 02:08:46 ]
Japanese O.K.

629 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 02:09:29 ]
RC2出たな

630 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 03:13:17 ]
a=[1,1,1,2,2,3,4,5,5,5]の配列を
b=a|aにしたら[1,2,3,4,5]となりますが、
1->3個,2->2個,3->1個,4->1個,5->3個のように
どの要素が何個かぶっていたかというのはどのようにしたらいいでしょうか?

631 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 03:26:54 ]
とりあえずは普通に数えればいい

overlap = Array.new
b.each do |bb|
count = 0
a.each do |aa|
count = count + 1 if aa == bb
end
overlap << [bb, count]
end
overlap.each do |i, n|
puts "#{i} の重複は #{n} 個です"
end

めんどくさい人向け

overlap = b.map{|e| [e, a.grep(e).size] }

632 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 03:27:07 ]
h=Hash.new
h.default=0
a.each do |i| h[i]+=1 end

俺も初心者に毛が生えた程度なので、より良いのがあれば指摘求む

633 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 03:28:53 ]
def uniq_c(org)
 counts = {}
 org.uniq.each{|e| counts[e] = org.count(e) }
 counts
end

とか。#countがどっから入ったか怪しいけど。
こーいう要望は割と定番なのでRuby "uniq -c"とかでググるとよろし

634 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 03:32:36 ]
確認したらArray#countはRUBY_VERSION >= '1.8.7'だった。代わり
org.count(e)
-> org.select{|x| e == x }.size



635 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 03:40:38 ]
最初のが一番マシだな
それ以降のはただのオナニー

もしかしたら演算記号メソッドで何かどうにかすればなんかどうにかなると思ったかもしれないけど、
残念ながらそういうのは無い
2つの配列の関係を解析して返すメソッドというのはあっても面白そうだとは思うが、きっとおおむね無駄だ

636 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 03:53:14 ]
>>631-634
ありがとございました
書き込んだ後,配列について調べてたらuniqっていうのがあるんですね.
>>635
そうです.なにかメソッドがあるのかなと思ったのですが.
数え上げしていけばいいくらいなんで無駄になりますよね.

637 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 05:27:54 ]
どこがオナニーなんだよ。数え上げる時は普通にHashを使うだろ
つーか>>631の最初のコードはズボラ過ぎる

638 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 05:38:19 ]
a.inject(Hash.new{0}){|h,v| h[v] += 1 ; h }

639 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 05:54:27 ]
>>632が一番マシですね

640 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 06:12:44 ]
普通に考えれば>>632だよな
少なくとも「最初のが一番マシ」はねーよw

641 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 09:10:58 ]
ハッシュは順番が保存されないのがなー

642 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 09:22:00 ]
この場合はたぶん順番必要ないよね

643 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 11:52:07 ]
正規表現を使って一致を見てるんだけど
正規表現のパターンの中に「図」っていう漢字をいれると

warning: regexp has `}' without escape

ってwarningでるんだけど何とかならないですか?



644 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 11:55:22 ]
その漢字の文字エンコード(普通、そのスクリプトのファイルの文字エンコード)を正規表現に指定しろ
っていうか、そのへんは解説なりなんなりでフォローがあったと思うんだが



645 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 12:04:10 ]
>>643
ファイルのエンコードは何つかってる?

646 名前:643 mailto:sage [2009/01/21(水) 12:30:03 ]
>>644-645
返事ありがとうございます。

/図/
ってやってるのでエンコードの指定は特に何にもやってないです
Regexpクラスかなんかをつかってそのインスタンスにエンコードを指定するってことですか?
ファイルはShift-Jisでやってます

647 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 13:00:30 ]
require 'jcode'
$KCODE = 'SJIS'
でとりあえずいいんじゃないの

648 名前:643 mailto:sage [2009/01/21(水) 13:06:04 ]
>>647
うまく行きました
ありがとうございます

649 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 13:07:18 ]
jcode厨がまだいたとは
jcodeは正規表現には全く関与しない

650 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 13:39:33 ]
>>643
-Kオプションについて調べるがよい

651 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 14:10:38 ]
いちいち起動するたびに -K オプション付けなくちゃいけないの?

652 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 14:16:18 ]
1行目
#!ruby -Ks

653 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 14:29:03 ]
>>652
i see.

654 名前:デフォルトの名無しさん [2009/01/21(水) 18:46:15 ]
データが文字列の内容に数字をふったものを対象にして
数字でソートする場合どんな感じでやればいいでしょうか。
文字数字のままやると小さい数字が後にきたりして、ソートがおかしくなるのですが。




655 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 19:01:10 ]
全部同じ桁にする

656 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 19:02:29 ]
sort メソッドの説明は気の利かない書き方をしてるからね
あれはブロックの結果がどうなるかでソートされるんだ

irb> puts ['30歳', '2歳', '10歳'].sort
10歳
2歳
30歳
irb> ['30歳', '2歳', '10歳'].each{|a| puts a.scan(/\d+/)[0].to_i}
30歳
2歳
10歳
irb> puts ['30歳', '2歳', '10歳'].sort_by{|a| a.scan(/\d+/)[0].to_i}
2歳
10歳
30歳


657 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 19:05:00 ]
>>654
数字を振るというのが文字列と別枠なら
hash = {3=>"c",2=>"b",1=>"a"}
hash.sort.map{|v| v.last}

658 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 19:12:11 ]
irb> ['30歳', '2歳', '10歳'].each{|a| puts a.scan(/\d+/)[0].to_i}
30歳
2歳
10歳

659 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 19:25:19 ]
>>658
あ、すまんね
そこのへんだけ直前に書き換えたんだ
案の定間違ってるな

irb> ['30歳', '2歳', '10歳'].each{|a| p a.scan(/\d+/)[0].to_i}
30
2
10

ってことで、ブロック内で数字部分を抜き出して整数にしてるんだということがわかってもらえればよかった
それぞれの要素に対して「数字部分を抜き出して整数にしたもの」で比較してソートすれば、おそらくうまくいく

660 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 01:31:38 ]
>>600
とりあえずC#(.NET3.5)では

int j = 1;
Thread t = new Thread(new ThreadStart(() => {
while (j < 100) {
Thread.Sleep(1000);
Console.WriteLine(j);
j += 1;
}
}));
t.Start();

while (j < 100) {
String i = Console.ReadLine();
j += Convert.ToInt32(i);
}

これが動いたから、IronRubyなら動くかもよw

661 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 04:51:23 ]
>>659
そこまで書いたなら最後まで書けばいいのに。
['30歳', '2歳', '10歳'].sort_by {|a| a.scan(/¥d+/)[0].to_i }
または
['30歳', '2歳', '10歳'].sort_by {|a| a =~ /¥d+/; $&.to_i }


662 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 14:26:38 ]
['30歳', '2歳', '10歳'].sort_by {|a| a[/\d+/].to_i }


663 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 14:40:21 ]
いや短くすることに意味はないから
そんなこと言ったら

%w.30歳 2歳 10歳..sort_by{|l|l.to_i}

が標準で最短だぞ

664 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 14:45:30 ]
たぶん単位とかだと思うけど、そういうのデータの中に含めるのってどうなんだろう
「1.5メートル」より「90センチ」の方が大きくなったりするんだろ?
さすがに「2メートル」と「5キロ」とかは混在していないと思うが



665 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 14:51:57 ]
生のデータを生のまま極力取り込んでおきたいという需要はそこそこあると思うよ
数値だけとかに正規化しとけというのはいやもう全くその通りではあるんだが

666 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 14:58:56 ]
>>665
そういうのはラッパクラス作って都合の良い方でアクセスできるようにしとく

667 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 15:11:59 ]
>>664-665の見てる世界と>>666の見てる世界は違うな

668 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 15:20:43 ]
データがアクセスされるのは一つの言語からだけとは限らないぞ
3つ言語使ってたら全部の言語でラッパークラスを実装するのか?

669 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 15:32:09 ]
それはまんどくさい(´・ω・`)

670 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 15:34:58 ]
>>668
1つの言語からだけのことのほうが圧倒的に多いと思うがどうかね
君は移植性の高いC言語を使うべきだと思うよ

671 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 15:46:13 ]
>君は移植性の高いC言語を使うべきだと思うよ
うむ

672 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 16:10:58 ]
データきたないと前の担当者に殺意を抱いたりするよなw

673 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 16:24:45 ]
>>667
全くだ
汎用DBソフトに格納される業務データしか扱ったことがないのだろう

674 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 16:33:35 ]
ほんとにどうでもいい話なんだけど

>>673
そういう人って稀にいるよね
業務でしかプログラミングに関わってない人
それはそれで仕事として効率もいいし好ましいことも多いが、話が全然合わんので困る



675 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 20:13:33 ]
仕事でやっててプログラミングを好きな人はまだ良いが
好きでもなく仕事だからってやってる奴のソースはだいたい汚い。
そういう時は殺意抱くなwww

676 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:33:48 ]
>>664
>たぶん単位とかだと思うけど、そういうのデータの中に含めるのってどうなんだろう

Measureというライブラリを使うと単位系を操ることができる
ttp://d.hatena.ne.jp/mrkn/20081025/sappororubykaigi01

677 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:30:36 ]
>>675
たしかに
a1=1
a2=2
a3=3
...
と延々と書かれていたことがある
配列+ループにするとか考えろと思ったが
行数で単価計算されるなら上の方が正解なのかも知れない

678 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 03:00:00 ]
配列として保持するコストを嫌ったのかもしれない

679 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 03:09:40 ]
世の中には虚しいこともあるんだね

680 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 03:57:53 ]
>>678がたぶん正解だと思う
行数稼ぎか配列利用法が理解できなかった(または利用禁止)な可能性も充分あるが

681 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:01:09 ]
つか、言語と実行環境に強く依存するな
配列にしてしまうと保持と参照コストが妙に高くなる言語というのはなんかどっかにあったはず

682 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:39:18 ]
array=[a,b2c,d2e,f,g]を[a,[b,c],[d,e],f,g]に分解するにはどうすればいいですか?

683 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:46:41 ]
>>682
標準的な方法はないから、まあ好きにやれ
要素ごとに正規表現で分割して自力で配列を作るしかないな

684 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:55:12 ]
>>682
split("2")とpushでOKじゃね?



685 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 05:18:20 ]
[a,b2c,d2e,f,g]

['a','b2c','d2e','f','g']
という意味なのか?

686 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 05:23:33 ]
>>685
この文脈ではそう考えるのが自然じゃね
配列の要素が参照している変数名の英字部分を
ネストした配列の要素の参照の変数名に反映したいという込み入った希望かもしれんが

687 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 05:34:30 ]
こうですか?わかりません

>> ['a','b2c','d2e','f','g'].map{ |e| /2/ =~ e ? e.split(/2/) : e }
=> ["a", ["b", "c"], ["d", "e"], "f", "g"]

688 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 06:33:01 ]
EOFにマッチする正規表現、または"末尾"がEOFであることを手短にチェックする方法ないですかね

キー1: 値1
キー2: 値2[EOF]


689 名前:227 mailto:sage [2009/01/23(金) 07:22:40 ]
昔のことになりますが、カテゴリ取得に関して質問したものです。
ログを見ていたら同じようなことが質問されていたのでまた、質問をさせていただきます。

search('a').select{|a| /cat_/ =~ a['href']}.map{|a| a.inner_text}
カテゴリが一つだけ指定されている場合は上のものでうまく言っていたのですが、
一つの記事で二つ以上指定されている場合にうまくいきません。
理想としてはcategory=["A",["A","B"],"A","B",["A","B","C"]]
のようにしたいのですが


690 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 07:50:36 ]
rubyってhtmlspecialcharsあるの?

691 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 07:52:37 ]
>>689
もっと具体的なhtmlの例を出してくれないと答えられないような…

692 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 07:58:05 ]
>>689
selectってなんだっけ、findだっけfind_allだっけ
…allのほうか

カテゴリってのは一番下にあるやつだな、他のブログではタグとか言われてるものだ

>>246では例が悪いので、適当な大手のアルファルアモザイク例に出すぞ
ttp://alfalfa.livedoor.biz/archives/cat_50026947.html

これから
[
 ["ネット・PC・技術", "短レス"],
 ["ネット・PC・技術", "短レス"],
 ["ネット・PC・技術", "知識・薀蓄"],
 …
]
という配列を抽出したいという要望でいいか?

「記事単位でsearchかけてから、それの返り値のHpricot::Elemなどに対してmapを使う」が答
なにをどうやって記事単位とみなすかはそのサイトのHTML構造読め

693 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 08:11:05 ]
>>690
あるよ

694 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 08:17:26 ]
>>691
>>692さんが例に上げたサイトのようなものです。
>>692さんが書かれたような配列です。記事単位はデザインの雛形によって変わってくるので調査済みです。
今移動中なんで確認できませんが,
記事単位.search('a').select{|a| /cat_/ =~a['href']}.map{|a|a.inner_text}みたいなものですか?



695 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 08:17:35 ]
require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'kconv'

doc = Hpricot.parse(URI.parse('blog.livedoor.jp/dqnplus/').read)
result = doc.search('div.hentry').map{|div|
[div.at('h3.title%20entry-title').inner_text,
div.search('a').find_all{|e| /archives\/cat_/ =~ e['href']}.map{|e| e.inner_text}]
}

result.each do |post|
puts "#{post[0]}[#{post[1..-1].join(', ')}]".toutf8 # 画面表示のエンコードに合わせること
end

けっか:
FF11、バグを利用してアイテムを複製した500人の廃人を強制退会処分に
[びっくりニュース, ゲーム]
次期ロシア正教会総主教のネット人気投票、日本人大主教がダントツ1位に…「日本アニメのファンが原因」とロシアマスコミ
[びっくりニュース, 国際]
「孫悟空」の起源は韓国のサルだった…韓国教授が主張
[痛いニュース, 韓国・北朝鮮]
パッケージに萌えキャラが描かれた「ツンデレカレー」「萌カレー」他が馬鹿売れ
[おバカなニュース, 食生活]
「若者、結婚が遅い…どんな恋愛してるのか」「日本はなぜ子供産むのが難しいのか」など、小渕大臣が少子化分析チーム
[痛いニュース, 政治・経済]



タグのネスト云々はこういうことをやりたいのだと推測
タグが1個しかない場合も要素1の配列になるので注意

696 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 08:23:21 ]
>>695
ありがとうございます。すぐに確認できませんが,帰宅したら確認します!






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

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

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