どっかにあるんだろうけど、自分用にメモ。
種別 | Perl | Ruby |
---|---|---|
制御構造 | while (COND) { ... } |
while COND ... end |
do { ... } while (COND); |
begin ... end while COND |
|
foreach VAR (LIST) { ... } |
for VAR in LIST ... end |
|
LIST.each do |VAR| ... end |
||
if (COND1) { ... } elsif (COND2) { ... } else { ... } |
if COND1 ... elsif COND2 ... else ... end |
|
case EXPR when EXPR11, ... # EXPR === EXPR11 or ... ... when EXPR21, ... # EXPR === EXPR21 or ... ... else ... end |
||
引数or標準入力に対する行処理 | while (<>) { ... } |
ARGF.each do |line| ... end |
標準入力に対する行処理 | while (<STDIN>) { ... } |
STDIN.each do |line| ... end |
ファイルに対する行処理 | my $filename = "FILENAME"; open(my $fh, $filename) or die "Can't open $filename ($!)"; while (<$fh>) { ... } close($fh); |
# ファイルがなければ例外を投げるので # die 相当は不要 IO.foreach("FILENAME") do |line| ... end |
ファイルの中を全部読む | local $/; my $data = <$fh>; |
data = fh.read |
data = IO.read("FILENAME") |
||
一般的なファイル処理 | my $r_fname = "R_FNAME"; my $w_fname = "W_FNAME"; open(my $rfh, '<', $r_fname) or die "Can't open $r_fname ($!)"; open(my $wfh, '>', $w_fname) or die "Can't open $w_fname ($!)"; ... close($wfh); close($rfh); |
rfh = open("R_FNAME", 'r') wfh = open("W_FNAME", 'w') begin ... ensure wfh.close rfh.close end |
バッファリング | $old_fh = select($fh); $| = 1; select($old_fh); |
fh.sync = true |
ファイル属性 | -e PATH -x PATH -f PATH -d PATH -l PATH -r PATH -w PATH -z PATH -s PATH # 等価な要素無し → |
include FileTest exist?(PATH) executable?(PATH) file?(PATH) directory?(PATH) symlink?(PATH) readable?(PATH) writable?(PATH) zero?(PATH) size?(PATH) size(PATH) |
検索 (正規表現) | opts = i, o, x, m, s $str =~ /PATTERN/opts $str =~ m@PATTERN@opts ($m1, ..., $mN) = ($str =~ /PATTERN/opts) # @ は任意の1文字 # $& は一致した文字列全体 # $1, ..., $9 は n 番目の括弧に対応 |
opts = i, o, x, m /PATTERN/opts =~ str %r@PATTERN@opts =~ str _, m1, ..., mN = *str.match(/PATTERN/opts) # @ は任意の1文字 # $~ は MatchData オブジェクト # $& は一致した文字列全体 # $1, ..., $9 は n 番目の括弧に対応 |
while ($str =~ /PATTERN/g) { ... # $&, $1, $2, ... } |
str.scan(/PATTERN/) do |matched| ... # $~ or $&, $1, $2, ... # PATTERN に括弧がない # ⇒ matched は $& 相当 # PATTERN に括弧がある # ⇒ matched は [ $1, $2, ... ] 相当 end |
|
$str = "abc\n123\n"; $str =~ /(.*)/; # $1 ⇒ "abc" $str =~ /(.*)/m; # $1 ⇒ "abc" $str =~ /(.*)/s; # $1 ⇒ "abc\n123\n" $str =~ /^(.*)$/; # $1 ⇒ no match $str =~ /^(.*)$/m; # $1 ⇒ "abc" $str =~ /^(.*)$/s; # $1 ⇒ "abc\n123\n" |
str = "abc\n123\n" # ← 等価な要素無し /(.*)/ =~ str # $1 ⇒ "abc" /(.*)/m =~ str # $1 ⇒ "abc\n123\n" # ← 等価な要素無し /^(.*)$/ =~ str # $1 ⇒ "abc" /^(.*)$/m =~ str # $1 ⇒ "abc\n123\n" |
|
置換 | $str =~ s/PATTERN/REPLACEMENT/gs; # $&, $1, $2, ... |
str.gsub!(/PATTERN/m, 'REPLACEMENT') # \&, \1, \2, ... str.gsub!(/PATTERN/m) {...} # $~ or $&, $1, $2, ... |
$str =~ s {PATTERN} { ... # $1, $2, ... }egs; |
str.gsub!(/PATTERN/m) do |matched| ... # $~ or $&, $1, $2, ... # matched は $& 相当 # |
|
組み込み変数 | $_ $&, $1, ... $? $! $@ $0 $$ @INC STDIN STDOUT STDERR # 等価な要素無し → # 等価な要素無し → # 等価な要素無し → %ENV @ARGV $^V $^O # 'linux' など $| # select() でファイルハンドルを選択 |
$_ $&, $1, ... $? $! $@ $0 / $PROGRAM_NAME $$ / Process.pid $LOAD_PATH STDIN # 子プロセスに影響を与える STDOUT # 子プロセスに影響を与える STDERR # 子プロセスに影響を与える $stdin # 子プロセスに影響を与えない $stdout # 子プロセスに影響を与えない $stderr # 子プロセスに影響を与えない ENV ARGV RUBY_VERSION RUBY_PLATFORM # 'x86_64-linux' など IO#sync # IOオブジェクトのメソッド |