2012年3月31日星期六

Programming Perl 4th : Chapter 2 - Chapter 4

$stuff = ("one", "two", "three");  #最后$stuff的值是three
$x = ( ($a, $b) = (7,7,7) );    # set $x to 3, not 2

识别句法的原则是,尽量当成函数参数。如果想让perl尽量不当成函数参数,可以在前面加个+号。最终效果看优先级。
 chdir +($foo) || die;       # (chdir $foo) || die
 chdir +($foo) * 20;         # chdir ($foo * 20)

next unless –M $file > .5;      # files are older than 12 hours,这个好用!

智能匹配是递归取到底的:
my @little = qw(red blue green);
my @bigger = ("red", "blue", [ "orange", "green" ] );
if (@little ~~ @bigger) {  # true!
    say "little is contained in bigger";
}

智能匹配检查HASH时只管看key,不管value
智能匹配先看右边的项,再看左边的项

given-when赋值要用do圈起来,因为given-when是返回状态,而非赋值:
my $value = do {
    given (<STDIN>) {
        0xFF0000 when /red/i;
        0x00FF00 when /green/i;
        0x0000FF when /blue/i;
        warn "unknown RGB component '$_', using black instead\n";
        0x000000;
    }
};

given是生成一个词法作用域的$_,跟foreach里面用的全局$_作用域不同。

when的组合匹配太晕了,暂时不看了P181

eval/sub/do的代码块,不是循环,不能直接用last/redo啥的,do可以多套一副括号绕过限制。
do {{  last if ... }} while(...);

our限制变量可用范围,local限制某个变量某个取值的覆盖范围,my则是词法变量二者均限制。my/local声明变量而不显示赋值时,默认会设成undef/()。

our变量一经指定,则相当于覆盖该范围的全局变量,任何改动即时生效。
针对our变量加local声明赋新值,该新值不能穿透子函数内部生效。

没有评论:

发表评论