古い記事
ランダムジャンプ
新しい記事
先日の Perl 小物[2006-09-05-2]に対して弾さんからいろいろ
コメントいただきました。いつもありがとうございます。
- 404 Blog Not Found:javascript - youtube selector + 勝手に添削
  http://blog.livedoor.jp/dankogai/archives/50621123.html

§

まず、「not defined」の件です。
http://blog.livedoor.jp/dankogai/archives/50621123.html
まず$sizeの初期化なのだけど、
$size = 5 if (not defined $size or $size < 1);
ってのは無駄が多い。
$size = 5 if $size < 1;
で充分。
昔はそうやっていたのですが、「use warnings」を使い始めたら、
警告 ("Use of uninitialized value ...") が出るようになったので、
いつも入れているのです…。
「if (not defined $size or ...)」以外の対処方ないですかねえ…。
% cat a.pl
#!/usr/bin/perl
use strict;
use warnings;
my $size;
testest($size);
sub testest {
    my ($size) = @_;
    print "hello\n" if $size < 1;
}
% ./a.pl
Use of uninitialized value in numeric lt (<) at ./a.pl line 8.
hello

「my $size = 0」みたいに、必ず初期化するってのが王道かな。
普段、CGIのパラメタなどは「my $key = $q->param('key') || ""」
などとしたりして未定義状態を避けています。
でも、中身が「0」のときとか困りますね。

まるごと Perl! Vol.1」の Perl 6 特集の竹迫さんの記事を読むと、
Perl 5.9.3 では「//演算子」というのがあって、この問題に対処できるそう。
「$x = 0 || 1」だと 1 になるけど、「$x = 0 // 1」だと 0 に。
これ便利そう!

§

それから、ヒアドキュメント(Here Text)のインデントの件。
インデントを無視する方法として、 Perl Cookbook にこんな方法が
載っていました。
my $var;
($var = <<HERE_TARGET) =~ s/^\s+//gm;
     your text
     goes here
HERE_TARGET
でも、最後の「閉じ用文字列(?)」はインデントできないのがなあ。
あと変数に受けるときにしか使えないのもちょっと…。

まるごと Perl! Vol.1」の Perl 6 特集の弾さんの記事を読むと、
ここで期待してる機能(下記)が Perl 6 で導入されるそう。
楽しみです。
my $here = qq:to/以上/;
  一行
    二行
  以上

§

日々勉強です…。