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; WorldPerl 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}; # ascalar %hashが数値のみを返すように
ハッシュをスカラコンテキストで評価すると、2/のようにキーの数と内部的に割り当てられたバケツの数をスラッシュでつないだ値が返ってきました。Perl 5.
use 5.026;
my %hash = (A => "A", B => "B");
say scalar %hash; # 2レキシカルサブルーチンが正式機能に昇格
あまり行儀の良いことではありませんが、no warningsを使って警告を抑制する必要がありました。
use 5.010;
use strict;
use warnings;
use Test::More;
ok 1;
{
    no warnings "redefine";
    local *ok = sub {
        my ($package, $file, $line) = caller;
        Test::More::ok($_[0], "LINE: $line");
    };
    ok 2; # ここでは行番号が出力される
    ok 3; # 同じく
}
ok 4; # 行番号は出力されない
done_testing;このような処理は、no warningsも、
use 5.018;
use strict;
use warnings;
use feature "lexical_subs";
no warnings "experimental::lexical_subs";
use Test::More;
ok 1;
{
    my sub ok {
        my ($package, $file, $line) = caller;
        Test::More::ok($_[0], "LINE: $line");
    }
    ok 2; # ここでは行番号が出力される
    ok 3; # 同じく
}
ok 4; # 行番号は出力されない
done_testing;ただし、use featureを使って明示的にレキシカルサブルーチンを使うことを宣言し、
この部分はPerl 5.experimentalプラグマを使うことで1行にまとめられます。ただ、experimentalプラグマには、MooseモジュールやRole::Tinyモジュールのように内部的にすべての警告を有効にしてしまうモジュールをあとから呼び出すと、
use 5.020;
use strict;
use warnings;
use experimental "lexical_subs";
# このあとでMooseなどを呼ぶと警告が復活するので
# use experimentalはなるべく最後に回す
...Perl 5.
レキシカルサブルーチンの罠
なお、
local *Test::More::ok = sub { ...}; # OK
my sub Test::More::ok { ... } # エラーまた、log関数が意図どおりに上書きされて、
use 5.026;
package Batch {
    my sub log { localtime.": $_[0]" }
    sub run { say log(10) }
}
Batch->run;次のようにすると、log関数は上書きされず対数が出力されます。
use 5.026;
package Batch {
    sub run { say log(10) }
    my sub log { localtime.": $_[0]" }
}
Batch->run;サブルーチンシグネチャの高速化
Perl 5.
use 5.020;
use experimental "signatures";
use Benchmark qw/cmpthese/;
cmpthese(10000000, {
    no_signature => sub { no_sig(1, "value") },
    signature => sub { sig(1, "value") },
});
sub no_sig {
    my ($num, $str) = @_;
    return "$num $str";
}
sub sig ($num, $str) {
    return "$num $str";
}Perl 5.
$ plenv local 5.20.0 && perl bench.pl
                  Rate    signature no_signature
signature    1261034/s           --         -35%
no_signature 1926782/s          53%           --この傾向はPerl 5.
$ plenv local 5.22.0 && perl bench.pl
               Rate       signature no_signature
signature    1218027/s           --         -37%
no_signature 1945525/s          60%           --Perl 5.
$ plenv local 5.24.0 && perl bench.pl
                  Rate signature no_signature
signature    1461988/s        --         -32%
no_signature 2164502/s       48%           --Perl 5.
$ plenv local 5.26.0 && perl bench.pl
                  Rate    signature no_signature
signature    2020202/s           --          -6%
no_signature 2155172/s           7%           --残念ながらまだ逆転とまではいきませんが、
機能の廃止や削除の予定
Perlの原作者のLarry Wall氏がPerl 6の開発に専念するようになってからというもの、
その現状は今も変わってはいませんが、
Perl 5.perldeprecationという文書を用意して、
まとめ
Perl 5.@INCからカレントディレクトリが削除されるなど、
さて、
本誌最新号をチェック!
WEB+DB PRESS Vol.130
2022年8月24日発売
B5判/
定価1,628円
ISBN978-4-297-13000-8
- 特集1
 イミュータブルデータモデルで始める
 実践データモデリング
 業務の複雑さをシンプルに表現!
- 特集2
 いまはじめるFlutter
 iOS/Android両対応アプリを開発してみよう 
- 特集3
 作って学ぶWeb3
 ブロックチェーン、スマートコントラクト、 NFT 


