gsub() を式として使う

なかなかダークな世界の話題です。

以下のファイルの

<br><br>

より前を抽出するという問題ですが、完全に gsub() / sub() の評価式問題に置き換わっています。

this is a message<br><br> ignore me
this is also a message a little longer<br><br>ignore me
hello<br><br> this is a message 
BEGIN{FS="<br><br>"}{print $1}

とか、

gsub(/<br><br>.*/,"")&&1 

までは良かったのですが、例によって Ed Morton が以下の例を出したことから始まりました。

sub(/<br><br>.*/,"")1

これって、連接ということでいいんですよね。(^^;

同様に以下のものでも一緒じゃないかという議論に進みます。

sub(/<br><br>.*/,"")&&1
sub(/<br><br>.*/,"")||1
sub(/<br><br>.*/,"")+1
sub(/<br><br>.*/,"")>=0
sub(/<br><br>.*/,"")0

例文に必ず

<br><br>

が入っているから、同じなのですが、入っていない場合結果が異なることを William James が指摘しています。

少し例文を変えてみましょう。

this is a message<br><br> ignore me
Hello. 

面倒なので、以下のような Makefile を用意します。

$ cat Makefile
INFILE = test.txt

ALL:
    gawk 'sub(/<br><br>.*/,"")' $(INFILE)
    gawk 'sub(/<br><br>.*/,"")0' $(INFILE)
    gawk 'sub(/<br><br>.*/,"") 0' $(INFILE)
    gawk 'sub(/<br><br>.*/,"")+0' $(INFILE)
    gawk 'sub(/<br><br>.*/,"")1' $(INFILE)
    gawk 'sub(/<br><br>.*/,"") 1' $(INFILE)
    gawk 'sub(/<br><br>.*/,"")&&1' $(INFILE)
    gawk 'sub(/<br><br>.*/,"")||1' $(INFILE)
    gawk 'sub(/<br><br>.*/,"")+1' $(INFILE)

実行してみます。

$ make
gawk 'sub(/<br><br>.*/,"")' test.txt
this is a message
gawk 'sub(/<br><br>.*/,"")0' test.txt
this is a message
Hello.
gawk 'sub(/<br><br>.*/,"") 0' test.txt
this is a message
Hello.
gawk 'sub(/<br><br>.*/,"")+0' test.txt
this is a message
gawk 'sub(/<br><br>.*/,"")1' test.txt
this is a message
Hello.
gawk 'sub(/<br><br>.*/,"") 1' test.txt
this is a message
Hello.
gawk 'sub(/<br><br>.*/,"")&&1' test.txt
this is a message
gawk 'sub(/<br><br>.*/,"")||1' test.txt
this is a message
Hello.
gawk 'sub(/<br><br>.*/,"")+1' test.txt
this is a message
Hello.

末尾に '0' が付いた部分を見ても分かるように、連接で動いているようです。
'+0' の処理の場合には、数値化されて '0' になります。