use VERSIONをする必要があった話

前回、非破壊置換修飾子(/rオプション)が便利って書いたけど、
これは、v5.14から入った機能なので、
Perlがv5.14未満の場合は実行できないようにしたい。

そういや、use VERSIONって、
どっかのタイミングで意味が変わったんじゃなかったっけ?って思って、
改めて調べてみることにしました。

http://perldoc.jp/func/use

ここを読む限り、
指定したバージョンより古いPerlで実行すると例外が発生するようです。

他にも、指定したバージョンで使えるすべての機能が有効になるので、
自分の場合はsayを使うために、use v5.10;って書いてました。

例えば、このコード。

use v5.14;
use strict;
use warnings;

my @foo = qw/a b c/;
my @bar = map { s/[abc]/x/r; } @foo;

say join(',', @foo), ' >>> ', join(',', @bar);

perlbrewをoffにして、Perl v5.12の環境で実行してみます。

$ perlbrew off
$ perl aaa.pl
Perl v5.14.0 required--this is only v5.12.4, stopped at aaa.pl line 1.
BEGIN failed--compilation aborted at aaa.pl line 1.

Perlのバージョンが古いから停止した旨が出力されました。

次に、1行目をuse v5.10;に書き換えて実行してみます。

$ perl aaa.pl
Bareword found where operator expected at aaa.pl line 6, near "s/[abc]/x/r"
syntax error at aaa.pl line 6, near "s/[abc]/x/r"
Execution of aaa.pl aborted due to compilation errors.

これだと、あれ?なんで???ってな感じでハマりますね。

という訳なので、今後はuse v5.14;って書いていこうと思います。
v5.14未満の環境の人、ゴメンなさい!

おしまい。

Leave a Comment