cocolog:87302261
no autovivification qw(strict warnings ...) がおかしい。Perl 5.10.x で使っていて大丈夫だったのが Perl 5.22.x (Perl 5.2x?) でダメになってる。 (JRF 0809)
JRF 2017年4月29日 (土)
<pre>
no autovivification qw(strict warn fetch exists delete store);
my %x;
if (exists $x{"n"}) {
print "OK\n";
}
</pre>
JRF2017/4/296736
これの Perl 5.10.1 での実行結果は、何も表示されない。Perl 5.22.1 での実行結果は、
<pre>
Reference vivification forbidden at tmp.pl line 4.
</pre>
…になる。
JRF2017/4/298156
バージョンが変わって、こういう動作になったということかな?
JRF2017/4/293081
もちろん、次のようなコードだと…
<pre>
no autovivification qw(strict warn fetch exists delete store);
my %x;
if (exists $x{"m"}->{"n"}) {
print "OK\n";
}
</pre>
JRF2017/4/299337
Perl 5.10 でも Perl 5.22 でも次のように表示されるのは思い通りの動作なんだけど…。
<pre>
Reference vivification forbidden at tmp.pl line 4.
</pre>
JRF2017/4/292206
何かおかしい。
最初のでエラーが出るのが意図した動作なのだろうか?
しかたないので、リリースのときだけ、no autovivification をコメントアウトするようにした。
JRF2017/4/291380
……。
あと、Perl 5.10 と Perl 5.22 の違いではまったのは、Perl 5.10 では大丈夫な次のようなコードが Perl 5.22 ではダメだったこと。 tmp.pl を次のようにする。
<pre>
foreach my $x qw(a b c) {
print "$x\n";
}
</pre>
JRF2017/4/299934
これが Perl 5.22 では…
<pre>
syntax error at tmp.pl line 1, near "$x qw(a b c)"
Execution of tmp.pl aborted due to compilation errors.
</pre>
…になる。
JRF2017/4/291137
ちなみにエラーメッセージもわかりにくくて
<pre>
foreach my $x qw(a b
c) {
print "$x\n";
}
</pre>
…とすると、
JRF2017/4/294907
<pre>
syntax error at tmp.pl line 2, near "c)"
(Might be a runaway multi-line () string starting on line 1)
Execution of tmp.pl aborted due to compilation errors.
</pre>
…と表示される。
JRF2017/4/291780
ちなみに、次のように foreach のあとにいきなり qw がこなければ OK。
<pre>
foreach my $x (qw(a b c)) {
print "$x\n";
}
</pre>
…とすると、
JRF2017/4/298145
<pre>
a
b
c
</pre>
…とちゃんと表示される。
JRF2017/4/299731
……。
追記。
Ubuntu 16.04 の perl 5.22 & autovivification 0.16 で試してみた。
結果、Active Perl 5.22 + autovivification 0.16 と同じ結果だった。ちなみに ActivePerl 5.24 + autovivification 0.16 でも同じ結果だった。
…バグだと思う。報告しようと思ったが、報告のページを見るとメールアドレスがほとんど公開されてしまうようなので、怖くて報告を出せない。
JRF2017/5/217783
トラックバック
他サイトなどからこの記事に自薦された関連記事(トラックバック)の一覧です。
quail-naggy.el と jrf_semaphore.pl をアップデートした。そららが共通している naggy-backend.pl のブラッシュアップが大きな変更点。 続きを読む
受信: 2017-06-28 19:14:53 (JST)
すごい簡単なコード、次のようなのが、Cygwin の Perl 5.10.1 & autovivification 0.12 では通るのに、ActivePerl の Perl 5.22.1 & autovivification 0.16 では通らない。tmp.pl を次のようにする。
JRF2017/4/291348