目的
こんにちは、Gakken LEAP のバックエンドエンジニアの mizuno です。
業務では使っていませんが、perl では様々な記述が省略可能であり、時に省略され過ぎて理解できないことがあります。
HTML エスケープ処理をする関数で省略された記述があり、今回はそちらについて調べてみました。
正規表現の対象が分からない
以下が HTML エスケープの関数になります。
sub escapeHTML {
$_ = $_[0];
s/&/&/g;
s/"/"/g;
s/'/'/g;
s/</</g;
s/>/>/g;
$_;
}
$_ = $_[0];
で引数に渡した文字列を $_
に代入したところまでは理解できたのですが、
そのあとに行われる正規表現がどの変数に対して行われているかでした。
$_ というデフォルト変数
答えはこちらに記述されていました。
https://perldoc.jp/docs/perl/5.38.0/perlreref.pod
=~ は正規表現が適用される変数を決定します。 省略された場合には、$_ が使われます。
- 変数を指定するようにする場合は
$str = 'hoge';
$str =~ s/&/&/g;
$str =~ s/"/"/g;
$str =~ s/'/'/g;
$str =~ s/</</g;
$str =~ s/>/>/g;
正規表現をする場合はこちらを常に使っていました。
- 変数を指定しない場合は
$_
に入力されている文字が対象になるようです。
$_ = 'hoge';
s/&/&/g;
s/"/"/g;
s/'/'/g;
s/</</g;
s/>/>/g;
こちらの手法は使っていなかったのですが、$_
を使えば正規表現の一部を省略して記述できることがわかりました。
ただし、暗黙的な変数であるため、頻繁に使ってしまうと可読性が悪くなる印象を受けました(なので、前職でperlを利用していた際にこの手法を先輩には教えられなかったのかもしれません)。
余談
さらっと、関数の引数を $_[0]
で取得していますが my ( $str ) = @_;
や
my $str = shift;
などを使って分かりやすい変数名にしておくと良いです。
もし、$_[0]
などを使うようであれば、コメントで補足説明を記述しておくと良いと思います。
まとめ
今回は正規表現でわからないことを調べてみました。
perl には省略や特殊変数があり、実際のプログラムを読んで理解できない場面が来ないと一生使わない機能があったりしそうだと思いました。
Gakken LEAP では教育をアップデートしていきたいエンジニアを絶賛大募集しています!!