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";
}
}