Perl から Ruby への移行メモ

Updated: 2008-01-30
Created: 2007-11-14


どっかにあるんだろうけど、自分用にメモ。

種別PerlRuby
制御構造
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 は $& 相当
      # PATTERN に括弧がない
      # ⇒ matched は $& 相当
      # PATTERN に括弧がある
      # ⇒ matched は [ $1, $2, ... ] 相当
end
組み込み変数
$_
$&, $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オブジェクトのメソッド

[TOP]