
アルファギークでも知らなかったというのは、不思議でもあり当然のようでもあり。
naoyaグループ - naoyaの日記 - if /regexp/../regexp/Perl で正規表現を .. すると、その間に含まれる文字列という意味でマッチさせられる。 % w3m -dump_source http://www.yahoo.com/ | perl -nle 'print if /^<style/../<\/style>/' とすると
これ、実に由緒正しい使い方で、たしかまだperlがhashすらサポートしていない頃からあったと記憶しています。なにしろsed/awkが起源ですから。
NAME operator - search.cpan.orgIn scalar context, ".." returns a boolean value. The operator is bistable, like a flip-flop, and emulates the line-range (comma) operator of sed, awk, and various editors. Each ".." operator maintains its own boolean state.
もちろん、日本語のドキュメントもあります。
The Perl5 Manual - 範囲演算子スカラコンテキストで使われたときには、".." はブール値を返します。この演 算子は、フリップフロップのように 2 値安定で、sed や awk や多くのエディタ での行範囲 (コンマ) 演算子をエミュレートするものとなります。
しかしこれを見て「こんなことまでできるのか、さすが変態言語」と言っているあなた、甘いです。以下をご覧下さい。
% GET http://www.yahoo.com/ | ruby -nle 'print if /^<style/../<\/style>/' <style type="text/css"> a{color:#16387c;} a:link,a:visited{text-decoration:none;} a:hover{text-decoration:underline;} <style type="text/css"> a{color:#16387c;} a:link,a:visited{text-decoration:none;} a:hover{text-decoration:underline;} </style> <style type="text/css" media="all"> #p{width:310px;} form{margin:0;} </style>Rubyリファレンスマニュアル - 演算子式
条件式として範囲式が用いられた場合には、式1が真になるま では偽を返し、その後は式2が真を返すまでは真を返します。式2が 真になれば状態は偽に戻ります。..は式1が真になっ た時にすぐに式2を評価し(awkのように)、 ... は次の 評価まで式2を評価しません(sedのように)。
これを見てもまだ信じられない人は、以下を実行していましょう。
% ruby -e 'require "open-uri"; open(ARGV.shift).each{|l| puts l if (l=~/^<style/i)..(l=~/\/style>/i)}' http://www.yahoo.com/
「レンジでチン」ならぬ「レンジでちょんちょん(..)」ないし「ちょんちょんちょん(...)」って、手軽で便利ですが、こんなところでも使われているというお話でした。
Dan the Man with Too Many Languages to Speak
貴方なら、私がなんであるか、分かるでしょう?
コメントとかあればホントお願いします。
ブログ内容を少しソフト化してみましたので。