rfコマンドのグローバル変数と定数
グローバル変数と定数
rfコマンドで定義されているグローバル変数と定数について解説します。
record, $_ , _
record, $_には現在のレコードが格納されています。_ (アンダーバー)はエイリアスになっています。
> echo 'foo bar baz' | rf record
foo bar baz
> echo 'foo bar baz' | rf '$_'
foo bar baz
> echo 'foo bar baz' | rf _
foo bar baz
fields, $F
fields, $Fは各フィールドが格納されたArrayです。添字は0始まりです。
> echo 'foo bar baz' | rf fields
foo
bar
baz
> echo 'foo bar baz' | rf '$F'
foo
bar
baz
> echo 'foo bar baz' | rf '$F[0]'
foo
> echo 'foo bar baz' | rf '$F[1]'
bar
_1, _2, _3, ...
_1, _2, _3, ... は各フィールドに対応した変数です。例えば、_1は$F[0]と同義です。
> echo 'foo bar baz' | rf _1
foo
> echo 'foo bar baz' | rf _2
bar
NR, $.
NR、$.は現在読み込んだレコードの数を表します。
foo
bar
baz
> rf '"#{NR} #{_}"' example-file
1 foo
2 bar
3 baz
> rf '"#{$.} #{_}" example-file
1 foo
2 bar
3 baz
組み込みメソッド
ここではrfコマンドが定義している組み込みメソッドについて解説します。
string?, hash?, array?
string? -> bool
hash? -> bool
array? -> bool
それぞれ、レコードがStringなのかHashなのかArrayなのかを判定します。レコードの型はフィルタやオプションによって違うのでそれを判定する目的です。
> echo foo | rf -q 'p string?'
true
> echo '{"foo": "bar"}' | rf json -q 'p hash?'
true
# -sオプションですべてのレコードを1つのArrayに格納したレコードにしています
> echo '{"foo": "bar"}' | rf json -s -q 'p array?'
true
match, match?
match(pattern) -> MatchData | nil
match(pattern) {|fields| ... } -> object
match?(pattern) -> boolean
m(pattern) -> MatchData | nil
m(pattern) {|fields| ... } -> object
m?(pattern) -> boolean
レコードが指定されたパターンにマッチしているかを判定し、マッチした結果を返却します。patternがStringの場合、それを正規表現として扱います。patternがRegexpの場合、そのインスタンスのmatchメソッドを呼び出します。trueが指定された場合はすべてにマッチし、逆にfalseの場合必ずnilが返却されます。ブロックが指定され、また、patternにマッチした場合にそのブロックが実行されます。ブロックには、各フィールドが引数として渡されます。ブロックの評価結果が返却されます。
match?は、patternにマッチしたらtrueを返却し、それ以外はfalseを返却します。
matchとmatch?はそれぞれmとm?という短い名前のエイリアスがあります。
> echo abc | rf -q 'p match("abc")'
#<OnigMatchData:0x330096e0>
❯ echo abc | rf -q 'p match(/abc/)'
#<OnigMatchData:0x3d7e5f0>
❯ echo abc | rf -q 'p match(/abc/){ "foobar" }'
"foobar"
❯ echo abc | rf -q 'p match?(/abc/)'
true
❯ echo abc | rf -q 'p m(/abc/)'
#<OnigMatchData:0x30dc75f0>
at_exit
at_exit { ... } -> nil
コマンド実行後に指定されたブロックを実行します。
> echo foo | rf '_; at_exit{ p "bar" }'
"bar"
Discussion