4引数substr

今日もPerlでプログラミング。正規表現で文字列の置き換えをしてました。

sub foo {
    my $r = shift;
    $r =~ s/^\^(.+)/^(?:\\[.+?\\]\\s*?)*?$1/;
    return qr/$r/;
}

上みたいなコードを書いてたんだけど、よく考えたらこれ正規表現を持ち出すまでもないんだよね。文字列の途中にべつの文字列を差し込むだけだから左辺値substrでいいや。と考えたところで、ふと昨日読み終わったPerl Best Practicesを思い出す。確か左辺値substrは使わないようにって書いてなかったっけ。で、PBPを確認したらありました。

Substrings

Use 4-arg substr instead of lvalue substr.

Damian Conway先生いわく、「左辺値substrのかわりに4引数のsubstrを使いましょう」とのこと。というわけで4引数のsubstrを使って書き直し。

sub foo {
    my $r = shift;
    substr $r, 1, 0, '(?:\[.+?\]\s*?)*?';
    return qr/$r/;
}

これでいいかな。あと少し気になるのが、studyを使おうかどうしようか。まあ、これを考えるのは最後でもいいから今はいいや。