北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

Re: Perl豆知識

Perl豆知識に便乗というかツッコミというか、です。

Re: 完全修飾名で呼び出す場合も括弧はいります。

use Carp;
Carp::croak('aaa');

Perl豆知識

これは以下のように括弧は不要のはずです。

use Carp;
Carp::croak 'aaa';

省略ができないのは、以下のようにメソッド呼び出しのときです。

use Text::Xslate;
Text::Xslate->new(path => ['.']);

Re: 無名サブルーチンは最初から最後まで存在する

静的な場合はそうですが、クロージャとなる場合は不要となった時点で破棄されるはずです。

【8/24 追記】↑こんなに事情は単純ではなく、id:perlcodesample さんがコメント欄でおっしゃっているようにサブルーチンの実体は最後まで開放されないようです。id:gfxさんの解説も合わせてご覧下さい(id:gfx++)。

use strict;
use warnings;

sub Hoge::DESTROY { warn $_[0]->(), " was destroied" }
my $static_func = bless sub { "static" }, 'Hoge';
my $message = "dynamic";
my $closure = bless sub { $message }, 'Hoge';

# % perl test.pl
# dynamic was destroied at test.pl line 4.

Re: 変数展開の注意

my $name = 'aaa';
my $message = "${name}::aaa ${name}_ppp";

Perl豆知識

これはもちろん正しいのですが、以下のように書いているコードも結構見かけます。

my $name = 'aaa';
my $message = "$name\::aaa $name\_ppp";

Re: ファイル読込のショートカット

これ、特に意識してませんでした。なるほどー。perlopに確かに書いてます。

この記述は

while (defined(my $line = <>)) {

}

 と同じ意味を持つので0だけが含まれる行なども、正しく読み込んでくれるので安心です。

Perl豆知識

ついでに "In other boolean contexts, <filehandle> without an explicit defined test or comparison elicits a warning" とも書いてます。へー。

% perl -we 'print $_ if $_ = <>;'
Value of <HANDLE> construct can be "0"; test with defined() at -e line 1.