トップ «前の日記(■2013-01-11) 最新 次の日記(■2013-02-01)» 編集

どんぞこ日誌

2003|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|07|08|12|
2007|01|04|08|12|
2008|01|02|03|04|06|07|08|10|11|12|
2009|01|02|04|05|06|07|08|09|11|12|
2010|01|03|04|07|08|10|11|12|
2011|01|02|03|04|05|06|07|08|10|12|
2012|01|02|03|05|06|07|08|09|10|
2013|01|02|07|08|09|
2014|08|09|
2015|08|
2016|06|07|12|
2017|01|03|08|

同人関連(どんぞこ楽屋) | 旧い雑文   


■2013-01-29

* [近況] Perl Beginners #6でちょっと触れてみたprototypeのことB!

 先週Perl Beginners #6に行ってきました。前半はJPA会長の牧さんによるQ&Aセッションでした。質疑の中で「モダンPerl入門」以外でXSに触れている本としてAdvanced Perl Programmingが出たのですが、そういえば初めて作ったXSモジュールはその本を読んで試してみたのを思い出しました。懐かしい。

 ところで、Q&Aセッションの中でprototypeの話が出てきて、以下のようなときぐらいしか使いどころがないよね、という話になって、そのとき私がもう一つこういうケースが……というので出した例を書いておきます。

 use v5.12;
 
 sub hoge (&) {
   ...
 }
 
 hoge { ... };

 こちら、ご存知の通り一番目の引数がコードリファレンスの場合はsubを省ける例のアレです。で、次のやつ:

 sub fuga (\$) { # $の前に\がつく
   my ( $v ) = @_;
   say ref( $v ); # => SCALAR
   $$v = 2;
 }
 
 my $foo = 1;
 
 fuga( $foo );
 
 say $foo; # => 2

 スカラー変数を値渡しで渡しているつもりがサブルーチン内部ではリファレンスとして渡されていますね。これは便利……なのか? ちなみにthreads::sharedで使われてます(実際にはXS側からprototype宣言されてますが、threads無効の場合はPerlコードからもダミー用として宣言されます)。

[]