第2章便利なオブジェクト

目次

  • 配列(Array)
    • 配列を作る
    • 配列からオブジェクトを取り出す
    • 配列にオブジェクトを格納する
    • 配列の中身
    • 配列と大きさ
    • 配列と繰り返し
  • ハッシュ(Hash)
    • ハッシュを作る
    • ハッシュからオブジェクトを取り出す
    • ハッシュの繰り返し
  • 正規表現
    • パターンマッチと正規表現

配列について

  • 長さ
    • array.size
names = ["yasuhisa","onoue","satou30"]
names.each {|n|
  print n,"\n"
}

hashについて

  • 作り方

font_table = {"nomal" => "+0", "small" => "-1", "big" => "+1"}

  • 追加の仕方

font_table["verybig"] = "+2"

  • ループの回し方
hash.each {|key,value|
  do.something(key,value)
}

おいらの問題1

  • こんな表をhtmlのtableで作ってください
    • tableかよ、とか言わないでくだしあ><
  • hash使ってやってください
    • hashなんで追加した順番はどうでもいいことにします
  • 余裕がある人は
    • key,value,追加した順番でsortとかやったりしてみるといい練習になるんじゃないかな…!!
    • もちろん、2章までには出てきてないと思うので、ググったり、レシピブック見るなりしてください
      • Perlクックブック見たくなってきた<俺
yasuhisa syou6162
kondo jkondo
hirose30 rosese

おいらの回答

print "<html><title>hatena id</title>"
print "<body>\n"
hatena_id = {"yasuhisa" => "syou6162", "kondo" => "jkondo", "hirose30" => "rosese"}
print "<table>\n"
hatena_id.each {|key, value|
  print "<tr>\n<td>",key,"</td><td>",value,"</td>\n</tr>\n"
}
print "</table>"
print "</body></html>\n"

おいらの問題2

  • 簡単なの
  • こんなhashがあったとします
names = {"吉田" => "康久", "近藤" => "淳也", "伊藤" => "直也"}
  • keyに「田」を含む人のみをフルネームで出力してください

おいらの回答

names = {"吉田" => "康久", "近藤" => "淳也", "伊藤" => "直也"}
names.each {|key, value|
  if // =~ key
    print key,value,"\n"
  end
}

id:InoHiroの問題

livedoor のWebサービスから土浦の天気を引っ張ってくるー
feed://weather.livedoor.com/forecast/rss/8/55.xml

おいらの問題1

require 'rss'
require 'iconv'

rss = RSS::Parser.parse('http://weather.livedoor.com/forecast/rss/8/55.xml')
rss.items.each{|item|
  puts Iconv::iconv('euc-jp','UTF-8',item.description.to_s)
}

おいらの問題2

  • 上のだけじゃつまらないので、見栄えよくしてみた
  • 画像のURL引っぱってこようと思ったけど、validじゃないところだったので、Ruby附属のRSSでは取ってこれない。。。
  • ということで、昨日使ったhpricotをxmlに対して使ってみた
  • ハッシュを配列にぶちこんであって、2章まででは出てこない
    • でも、まあいいか
require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'iconv'
require 'pp'

url = 'http://weather.livedoor.com/forecast/rss/8/55.xml'
doc = Hpricot( open(url).read )

yosou = []
(doc/:item).each {|item|
  forecast = {}
  title = item/:title
  forecast["天気"] = Iconv::iconv('euc-jp','UTF-8',title[1].inner_text)
  url = item/:url
  forecast["image"] = Iconv::iconv('euc-jp','UTF-8',url.inner_text)
  description = item/:description
  forecast["説明"] = Iconv::iconv('euc-jp','UTF-8',description.inner_text)
  yosou.push(forecast)
}

print "<html><title>天気予報</title>"
print "<body>\n"
print "<table>\n"

yosou[1..yosou.size].each {|day|
  print "<tr>\n<td><img src=\"",day['image'],"\" /></td>\n<td>",day['天気'],"</td>\n<td>",day['説明'],"</td>\n</tr>\n"

}
print "</table>"
print "</body></html>\n"

こんな感じで出力できた。

追記

@_tad_さんにいろいろ教えてもらったんだけど、それに関するメモを書くのを忘れていた。が、id:InoHiroが完璧にメモを取ってくれていたようだ。「***.methods」とかは参考になる。