Unknown Region

プログラムでハマったエラーとその解決方法についての備忘録メモ

【Perl】マージミスによるヒアドキュメントの落とし穴にご用心

複数人で開発を行うときにGITなどのバージョン管理ツールはとても便利ですが、誰かが変なコードをコミットしていた場合にあとあと関係ない場所でおかしなトラブルが発生する事があります。

こういうケースに実際に遭遇したので備忘録がてらにメモ。

 

問題のコード例: 

#!/usr/bin/perl
use strict;
use warnings;
use utf8;

my $str="";
# IF文A
if (1) {
  $str=<<"EOS";
  print "hoge\n";
}

# IF文B
if (0) {
  $str=<<"EOS";
EOS
  print "fuga\n";
}

exit;

ぱっと見、IF文Bの中は絶対に実行されないデッドコードのように見える。

そのため「hoge」という文字列が表示されるのが想定されるだろう。

だがしかし、実際に出力されるのは「fuga」という文字列だ。

 

IF文Aの中のヒアドキュメントの終了文字「EOS」が欠落しているため、IF文B内部のEOSまでがヒアドキュメントとして扱われてしまう。

 

赤く色をつけた部分が$strのヒアドキュメントの範囲:

my $str="";
# IF文A
if (1) {
  $str=<<"EOS";
  print "hoge\n";
}

# IF文B
if (0) {
  $str=<<"EOS";
EOS
  print "fuga\n";
}

これではIF文Bを延々と数時間眺めていても分からない。

怖い怖い。