Perl 5.26で新たに追加されたもの
このように非互換性の話ばかりしているとPerl 5.
インデント付きヒアドキュメント
ある程度まとまった分量の,
print <<"END";
$name さん,こんにちは。
...
END
ただ,
sub print_hello {
my $name = shift;
if ($name) {
print <<"END";
$name さん,こんにちは。
...
END
}
}
Perl 5.
sub print_hello {
my $name = shift;
if ($name) {
# 出力される内容は前と同じ
print <<~"END";
$name さん,こんにちは。
...
END
}
}
コンフリクトを起こしているソースコードの検出
Gitなどのバージョン管理システムを利用して開発を進めていると,
<<<<<<< HEAD
print "Hello, World!";
=======
print "Goodbye, World!";
>>>>>>> test
従来のPerlは,
Version control conflict marker at test.pl line 1, near
"<<<<<<<"
Version control conflict marker at test.pl line 3, near
"======="
Version control conflict marker at test.pl line 5, near
">>>>>>>"
Unicode 9.0サポート
Perl 5.
/xx正規表現修飾子
従来からある/x
正規表現修飾子を使うと,/x
修飾子は文字クラスの中身までは対象にしません。そのため,
my $string = "Hello, World!";
my @words = $string =~ / ([ a-z A-Z ]+) /gx;
say join ";", @words; # Hello; World
Perl 5./xx
修飾子を使うと,
my $string = "Hello, World!";
my @words = $string =~ / ([ a-z A-Z ]+) /gxx;
say join ";", @words; # Hello;World
特殊変数@{^CAPTURE}など
マッチしても,
たとえば,
use 5.010;
my $string = "a: b c";
$string =~ /\A(.+?): (.+?) (.+)\z/;
say "$1, $2, $3"; # a, b, c
今,
my $string = "a: b";
$string =~ /\A(.+?): (.+?)(?: (.+))?\z/;
say "$1, $2, $3"; # a, b,
出力結果の最後に余計な,
が付いているのは見栄えが良くないですし,warnings
プラグマを有効にしていると警告が出るのもいただけません。
このような場合,$3
の値が定義されているかどうかで挙動を変えてもよいのですが,$0
から始まる特殊変数が何文字目から始まり何文字目で終わるという情報を格納している特殊変数@-
と@+
を見ると,substr
関数を使って導き出せます。
my $string = "a: b";
$string =~ /\A(.+?): (.+?)(?: (.+))?\z/;
say $#-; # 2
my $first = substr($string, $-[1], $+[1] - $-[1]); # $1
検索の場合はマッチした値を直接配列で受け取ることもできますが,
my $string = "a: b";
my @capture = $string =~ /\A(.+?): (.+?)(?: (.+))?\z/;
say join ", ", @capture; # a, b,
Perl 5.@{^CAPTURE}
特殊変数を使うと,
use 5.026;
my $string = "a: b";
$string =~ /\A(.+?): (.+?)(?: (.+))?\z/;
say scalar @{^CAPTURE}; # 2
say join ", ", @{^CAPTURE}; # a, b
say ${^CAPTURE}[0]; # a
# この特殊変数には1つバグがあるが
# 次のバージョンで修正される見込み
say "${^CAPTURE}[0]"; # [0]
同様に,@-
や@+
に対応する特殊変数%-
や%+
を駆使する代わりに,%{^CAPTURE}
や%{^CAPTURE_
という特殊変数を使うと同じようなことができます。
use 5.026;
my $string = "a: b";
$string =~ /\A(?<A>.+?): (?<B>.+?)(?: (?<C>.+))?\z/;
say scalar %{^CAPTURE}; # 2
say join ", ", sort keys %{^CAPTURE}; # A, B
say ${^CAPTURE}{A}; # a
- 注8)
- これらの特殊変数はPerl 5.
6で追加されたものです。