お知らせ

現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。

Perlのループ処理で正規表現キャプチャを扱う

投稿日:
言語::Perl

確認環境

Env Ver
Perl 5.34.0

コード例

キャプチャ変数をifのスコープに封じ込める必要がある

my $text = <<EOF;
  ```unya
  hoge
    piyo
      fuga
  hpf
  ```
EOF

my @lines = split(/\n/, $text);

foreach my $line (@lines){
  if ($line =~ /^(?<indent> *)(?<bquote>```)(?<lang>[a-z]*)$/) {
    print "SYMBOL: '$+{indent}', '$+{bquote}', '$+{lang}'\n";
  } else {
    print "$line\n";
  }
}

上手くいかないコードの例

その1

$+変数はマッチするまで中身が消えないので、このプログラムは予期した動きにならない

my $text = <<EOF;
  ```unya
  hoge
    piyo
      fuga
  hpf
  ```
EOF

my @lines = split(/\n/, $text);

foreach my $line (@lines){
  $line =~ /^(?<indent> *)(?<bquote>```)(?<lang>[a-z]*)$/;
  print "$+{indent}, $+{bquote}, $+{lang}\n";
}

その2

my $text = <<EOF;
  ```unya
  hoge
    piyo
      fuga
  hpf
  ```
EOF

my @lines = split(/\n/, $text);

foreach my $line (@lines){
  $line =~ /^(?<indent> *)(?<bquote>```)(?<lang>[a-z]*)$/;
  if (defined $+) {
    print "$line: ";
    print "$+{indent}, $+{bquote}, $+{lang}\n";
    # この変数はundef出来ない
    undef $+;
  } else {
    print "$line\n";
  }
}