perl-5.16

注意

まずはじめに

おてもとのperlでお試しください

% perl -v

ほとんどの人はこのように表示されるはずです。

This is perl 5, version 15, subversion 9 (v5.15.9) built for darwin-2level

新機能の紹介の前に…

おさらい

5.10.0から5.14.2まで

5.10

// (defined-or)

$foo ||= 'bar';

例えば:

sub foo {
    my ($foo) = @_;
    $foo ||= 'bar';
}

// (defined-or)

$foo ||= 'bar';

$foo = 'bar' unless defined $foo;

// (defined-or)

$foo //= 'bar';

~~ (smart match)

my $enc = 'utf8';
die unless $enc eq 'utf8' || $enc eq 'shiftjis' || $enc eq 'euc-jp';

~~ (smart match)

my $enc = 'utf8';
die unless $enc eq 'utf8' || $enc eq 'shiftjis' || $enc eq 'euc-jp';

my $enc = 'utf8';
die unless $enc =~ /^(?:utf8|shiftjis|euc-jp)$/;

~~ (smart match)

die unless 'utf8' ~~ [qw/utf8 shiftjis euc-jp/];

5.12

5.14

push $arrayref, @stuff;

一部の組み込み関数がリファレンスを受け取ることができるようになりました

push, unshift, pop, shift, splice, keys, values, each

package Foo {}

packageがブロックを受け取ることができるようになりました

{
    package Foo;
    ...
}
{
    package Bar;
    ...
}

package Foo {
    ...
}
package Bar {
    ...
}

s///r

非破壊的なs///

my $foo = 'foobar';
(my $bar = $foo) =~ s/foo/chars/;

my $foo = 'foobar';
my $bar = $foo =~ s/foo/chars/r;

feature プラグマ

おさらい終わり

5.16の新機能の紹介

feature プラグマ

unicode_eval, evalbytes

unicode_eval

evalがuse utf8;を無視するようになります

evalbytes

evalbytes()

バイト列ではなく、文字列が渡されると例外を投げます

current_sub

__SUB__

現在のサブルーチンのコードリファレンスを返します

Perl で JS の arguments.callee 的なことしようと思ってハマった

Perl で JS の arguments.callee 的なことしようと思ってハマった

それDevel::Caller でできるよ

Perl で JS の arguments.callee 的なことしようと思ってハマった

それDevel::Caller でできるよ

それ__SUB__

use Devel::Caller qw(caller_cv);

sub {
    my $c = shift;
    print "$c\n";
    caller_cv(0)->($c) if $c--;
}->(10);
use 5.016;

sub {
    my $c = shift;
    say $c;
    __SUB__->($c) if $c--;
}->(10);

array_base

レガシーな変数$[有効にします

(配列の起点を変更できます)

今までは$[deprecatedでしたが

今までは$[deprecatedでしたが

5.16からはarray_baseを有効にしないと使えなくなります

fc

fc()

foldcase

文字列を大文字小文字区別しないで比較したい

print lc('ß') eq lc('ss') ? 1 : 0; # => 0
print uc('ß') eq uc('ss') ? 1 : 0; # => 1

print 'ß' =~ /ss/i ? 1 : 0;
print fc('ß') eq fc('ss') ? 1 : 0;

featureプラグマ終わり

use VERSION

use 5.008001;

今まで

これから

ところで、use VERSIONしたら何をしてくれるのか

use 5.010;

use feature ':5.10'; # say state switch
use 5.012;

use strict;
use feature ':5.12'; # say state switch unicde_strings
use 5.016;
use 5.016;

use strict;
use feature ':5.16';

5.16からはすべてのバージョンのfeatureの動作が少し変わります

:5.10  say state switch array_base

:5.12  say state switch unicode_strings array_base

:5.14  say state switch unicode_strings array_base
:5.10  say state switch array_base

:5.12  say state switch unicode_strings array_base

:5.14  say state switch unicode_strings array_base

:5.16  say state switch unicode_strings
       unicode_eval evalbytes current_sub fc

↑ array_baseがない!

つまり、use VERSIONは

追加されたモジュール

削除されたモジュール

5.16のまとめ

以上です

ありがとうございました