現実の挙動は、こうですね。 ↓ % export PERL5OPT='' % perl -MO=Deparse -Mfeature=signatures -le 'sub func($a, $b){} ;my $ref =\&func ; $ref->()' The signatures feature is experimental at -e line 1. BEGIN { $/ = "\n"; $\ = "\n"; } sub func {
use feature 'signatures';
die 'Too many arguments for subroutine' unless @_ = 2;
my $a = $_[0];
my $b = $_[1];
(); } use feature 'signat
サブルーチンの引数 (スコア:0)
ん?なにが変わったんだろ?と一瞬分からなかった。
最近PHPの案件が多かったせいでその書き方に違和感が無くなってたんだな。
Re: (スコア:1)
-- 哀れな日本人専用(sorry Japanese only) --
Re: (スコア:4, 参考になる)
単に my($bar,$hoge)=@_;としただけだと、関数呼び出し時の引数型チェックが行われません。
と等価って感じじゃないかな。こう書いた場合は、関数fooの呼び出しで引数がスカラー値2つじゃなかったらエラーになります。
こう書くよりは直感的(というかC言語的というか他のC言語系スクリプト言語に近い)だしわかりやすいと思いますが、Experimental だし、既存のPerlでも動くようにってことを考えると、しばらくは使
Re:サブルーチンの引数 (スコア:5, 参考になる)
Perl 5.20 の perlsub (英語) [metacpan.org] とかを読んでちょっと調べてみた。
だいたい等価だけれど、完全に等価ではないのでメモ。
従来のプロトタイプはサブルーチンの本体の一部にはならないので、サブルーチンへの参照を使って呼び出した時にはチェックされない。
これに対し、新しいシグネチャーはサブルーチンの本体の一部なので、参照を使って呼び出した時でもチェックされる。
ほかにも何か違いがあるかも。
Re: (スコア:0)
現実の挙動は、こうですね。
↓
% export PERL5OPT=''
% perl -MO=Deparse -Mfeature=signatures -le 'sub func($a, $b){} ;my $ref =\&func ; $ref->()'
The signatures feature is experimental at -e line 1.
BEGIN { $/ = "\n"; $\ = "\n"; }
sub func {
use feature 'signatures';
die 'Too many arguments for subroutine' unless @_ = 2;
my $a = $_[0];
my $b = $_[1];
();
}
use feature 'signat