ruby

配列の初期化

a = ['quick', 'brown', 'fox'] b = %w[jumps over the lazy dog] c = 'quick brown fox jumps over the lazy dog'.split(/\s/) d = 'quick brown fox jumps over the lazy dog'.scan(/[^\s]+/) # ファイルから読み込んで配列に入れる open('test.txt') {|f|…

1日後や1ヶ月前の日付を得る

require 'date' def time_to_date( t) DateTime.new( t.year, t.mon, t.day, t.hour, t.min, t.sec) end def date_to_time( d) Time.mktime( d.year, d.mon, d.day, d.hour, d.min, d.sec) end t1 = Time.now # 基準日 d1 = time_to_date( t1) p (d1 + 1).st…

今日の日付を得る

p Time.now p (Time.now+1*60*60*24) # 1日後 p Time.now.strftime("%Y/%m/%d %H:%M:%S") strftimeの書式はstrftime(3)を参照する.直接,数値を取得するには: p Time.now.day p Time.now.min

16進数を10進数にする

p "ff".hex #=> 255 p sprintf("0x%04x", "a5".hex) # 16進数にする #=> "0x00a5" p [0,16,32,128,255].pack('c*').unpack('H*') #=> ["00102080ff"] p ["ff20"].pack('H*').unpack('C*') # 符号無し #=> [255, 32] p ["ff20"].pack('H*').unpack('c*') # 符…

三角関数

pi = Math.atan2(1, 1)*4; のようにクラスを指定して使うかinclude Math pi2 = atan2(1, 1)*4 のようにインクルードして使う(らしい)cos,sin,exp,log,atan2,sqrtがあればとりあえずは足りるか. p Math::PI # 円周率

連続する整数を操作する

3.times {|n| p n} p "-" (5..9).each {|n| p n} p "-" 7.step(10,2) {|n| p n} p "-" stepがあれば,uptoやdowntoは使わなくてもいいような気がするので,メモせず.

文字列が数値かどうか調べる

p "32" =~ /^[+-]?\d+$/ # 整数かどうか? p "0xff5A" =~ /^0x[0-9a-f]+$/i # 16進数かどうか? p "-256.03" =~ /^[+-]?\d+\.?\d*$/ # 小数.ただし .0とかを見逃す .0とか別にいいよね. チェックしたかったら,無理に奇妙な正規表現にするより,もう一つ正規…

全角半角,ひらがなカタカナの変換

require 'jcode' p "ひらがなカタカナ112934ンァヲ".tr('a-zA-Zァ-ン0-9', 'a-zA-Zぁ-ん0-9') #=> "ひらがなかたかな112934んぁを" jocdeを入れないと全角文字を正しく扱えない.

文字コードの変換

require 'kconv' str = "文字コード" str_sj = str.tosjis str_u8 = str.toutf8 p str.kconv(Kconv::UTF8, Kconv::SJIS) # s-jisからutf8に変換

#文字コードとの比較? p ("abc"[1]==?b)? "yes": "no" #ダブルクォートのエスケープを軽減 str = %q(XYZZYX,"","xxx","zzz, yyy","a \"fff\" aaa,",2,"yyy, qqq eee"); p str #=> "XYZZYX,\"\",\"xxx\",\"zzz, yyy\",\"a \\\"fff\\\" aaa,\",2,\"yyy, qqq e…

csv形式のデータを解析する

# 読み込み require 'csv' CSV.open( inputfile, 'r' ) do |row| p row end # 書き込み CSV.open( outputfile, 'w', "\t") do |writer| writer << row end で,できるらしい.未テスト

文字列の先頭と末尾の空白を削除する

str = " abcXYZdefABCasfgYAb " p str.sub(/^\s+/, "").sub(/\s+$/, "") # 正規表現 p str.strip() # 専用命令

ヒアドキュメント

TODO: そのうち調べる

文字列を大文字/小文字にする

str = "abcXYZdefABC" p str.upcase p str.downcase # 適当に大文字/小文字に変換する str = 'abcxyzdefabcasfgyabjahisfaaaewiyfet' p str.gsub(/./) {|x| (rand(100)<50)? x.downcase: x.upcase } #=> "abCxYZdEfabCASFgYABjahiSFaAAEWiyFEt"

タブを空白に,空白をタブに変える

def tabify(str) s = untabify(str) # タブが含まれていると位置がズレる a = s.scan(/.{1,4}/) # タブ幅4 a = a.map {|x| x.sub(/ +\z/,"\t") } a.join('') end def untabify(str) tab_size = 4 # タブ幅4 a = str.split(/(\t)/) a.inject(s='') {|x,y| x <…

文字単位,単語単位で反転する

p "abcdef".reverse p "abc def ghi jklmn opqr".split(' ').reverse.join(' ') p "日本語の反転".scan(/./).reverse.join('') こんなの使わないんじゃ…

文字列を文字コードの配列に変換する.またその逆

a = "abcdef".unpack("c*") p a.pack("c*") # 1文字単位で処理する str = "abcdef" str.each_byte {|x| p ":#{x}"} str.gsub(/./) {|x| p ";#{x}"} p str.scan(/./) # 1文字ずつ配列にする

デフォルト値を設定する

x ||= 'y' # x = 'y' unless x と等価?

部分文字列を取りだす

str = "abcdefghijklmn" # mからn番目の文字までを取り出す p str[2..4] # m番目からn文字を取り出す p str[2,4] # m番目以降のすべてを取り出す. p str[5..-1] # 指定部分を置き換える.長さが違っていてもよい str[2,4] = "XYZ" p str # str[0,1] = "" # …

備忘録目次

perl cookbookの中で,使いそうな機能をメモしてみる. 適当に書いているので,普通にバグが入っていそう.バグを見つけたらこっそり直す予定. 部分文字列を取りだす - ロバの耳 デフォルト値を設定する - ロバの耳 文字列を文字コードの配列に変換する.ま…

ファイルが存在するかチェックする

File.exist?(path) # ファイルがあれば真を返す File.file?(path) # 通常のファイルならば真を返す File.directory?(path) # ディレクトリなら真を返す

ファイル名をその構成要素に分割する

p File.basename("foo/bar.c") #=> "bar.c" p File.basename("foo/bar.c", ".*") #=> "bar" p File.extname("foo/bar.c") #=> ".c" p File.dirname("foo/bar.c") #=> "foo" こんな便利なものがあったとは.いままで,こんな感じのコードをわざわざ書いていた…

ファイルをリネームする

File.rename( oldname, newname)

ディレクトリとその中身を削除する

require "FileUtils" FileUtils.rmdir( path) FileUtils.rm_rf( "no_empty_dir") # ディレクトリの中身毎削除する

パターンにマッチするファイルを操作する

ディレクトリ内のすべてのファイルを処理する Dir.glob("*.*") {|f| p f} \0で区切ることで複数のパターンを指定できる Dir.glob("f*\0b*")で,fかbで始まるファイルを検索する. dosのワイルドカードよりも柔軟な指定が可能. Dir.glob("[A-C]*")でaからcで…

ファイルをコピーまたは移動する

ベタに src = open('test1.txt') dst = open('test2.txt', 'w'); dst.write( src.read) dst.close src.close require "FileUtils" FileUtils.cp('test1.txt', 'test2.txt') # コピー 第二引数にはディレクトリを指定してもよい. FileUtils.mv('test1.txt', …

ファイルを削除する

require "FileUtils" FileUtils.rm('test.txt') FileUtils.rm('NotExistFile', {:force => true}) :force => true を指定すると,エラーが出ても例外を出さない.File.delete(ファイル名)で普通に削除できる.

タイムスタンプを取得/設定する

fname = "test.txt" s = File.stat(fname) p s.atime# 最終アクセス時刻 p s.mtime# 最終更新時刻 p File.atime(fname).strftime("%Y/%m/%d %H:%M:%S") p File.mtime(fname).strftime("%Y/%m/%d %H:%M:%S") # 今日の日付に変更する at = Time.now mt = Time.…

バイナリファイルから文字列を読み取る

a = File.open('xxx.jpg').binmode.read() p a.scan(/(\w{4,})\0/) # 4文字未満はゴミとして捨てる

ランダムアクセスI/Oを使用する

IO#seek(offset,whence=IO::SEEK_SET) IO::SEEK_SET ファイルの先頭から IO::SEEK_CUR 現在のファイルポインタから IO::SEEK_END ファイルの末尾から 失敗した場合は例外が発生する