19 April 2005
This post may be outdated due to it was written on 2005. The links may be broken. The code may be not working anymore. Leave comments if needed.

Perl Quiz/小测试

下面的题目大多摘抄自网上(一点点自己想的),还没完成。不定时增加中。
如果你有好的题目,发 Email 到 fayland_at_gmail_com

http://www.jimandkoka.com/display.cgi/quiz/quiz.tpl?quiz=28
这是个非常好的 Quiz, Enjoy!

Let's start

  1. 已知如下代码:
    
    @array = qw/a b c d/;
    @array{ @array } = ( [ @array ] ) x @array ;
    
    求@array与%array
    答案
  2. 
    $foo = 'a';
    $bar = \$foo;
    {
        my $foo = 'b';
        print $$bar;
    }
    {
        local $foo = 'c';
        print $$bar;
    }
    {
        $foo = 'd';
        print $$bar;
    }
    
    输出结果
  3. 
    sub val { return 1..3 }; 
    $ref1 = \(&val); 
    print ref $ref1, "\n"; 
    $ref2 = \(val()); 
    print ref $ref2, " $$ref2\n"; 
    ($ref3) = \(val()); 
    print ref $ref3, " $$ref3\n";
    
    输出结果
  4. print print print print print;
    输出结果
  5. $x = 'fuzz';
    $x++;
    print $x;
    输出结果
  6. $i = 1;
    print $i++, ++$i;
    $i = 1;
    print ++$i, $i++;
    
    输出结果
  7. 
    sub Foo::show { print 'Foo::show' };
    my %class = ( name => 'Foo' );
    print qq{$class{name}->show; #};
    
    输出结果
  8. 
    print "Mary Ann Summers" =~ /(Ann?)/;
    print "Mary Ann Summers" =~ /(Ann??)/;
    print "Mary Ann Summers" =~ /(Ann?? Summers)/;
    
    输出结果
  9. 
    # slice #1
    $x = "skipper"; { my $x = "gilligan"; $y = "x"; print $$y; }
    # slice #2
    $x = "skipper"; { local $x = "gilligan"; $y = "x"; print $$y; }
    
    输出结果
  10. print join ",", split /(A)/, 'AAAA', 3;
    输出结果
  11. my @x = ('a', 'b', 'c');
    my $y = scalar ('a', 'b', 'c');
    my $z = scalar @x;
    
    print $y,',',$z;
    输出结果
  12. print  (1 + 4) + 7;
    print +(1 + 4) + 7;
    输出结果
  13. $x = (sort => (4, 8, 6));
    $y =  sort => (4, 8, 6) ;
    求 $x 和 $y 为多少

Answer/答案

  1. 题一答案
    
    @array = qw/a b c d/;
    %array = (
        'a' => [ 'a', 'b', 'c', 'd' ],    
        'b' => [ 'a', 'b', 'c', 'd' ],    
        'c' => [ 'a', 'b', 'c', 'd' ],    
        'd' => [ 'a', 'b', 'c', 'd' ],    
    );
    
    如果不明白,请参考 http://www.sysarch.com/perl/hash_slice.txt
  2. 结果为:aad
    如果您错了,建议您再去学习下引用。
  3. 结果为:
    CODE
    SCALAR 3
    SCALAR 1
    如果您错了,建议您再去学习下引用。Effective Perl Programming by Addison Wesley 是本很好的书。
  4. 结果为:1111
    print 成功输出时返回1
  5. 结果为:fvaa
    字母也可以用++, a++ 为 b,z++ 为 aa,所以 fuzz++ 为 fvaa
  6. 结果为:1332
    details: weird thing with say ++$
  7. 结果为:Foo->show; #
    因为qq{}里是不允许函数调用的,需要函数调用的话得用qq{},Foo->show,qq{}
  8. 结果为:
    
    print "Mary Ann Summers" =~ /(Ann?)/; # print Ann
    print "Mary Ann Summers" =~ /(Ann??)/; # print An
    print "Mary Ann Summers" =~ /(Ann?? Summers)/; # print Ann Summers
    
    考的是 ? ,不贪婪匹配(最短匹配)
  9. 结果为:slice #1输出skipper,slice #2输出gilligan
    Soft references cannot access my() variables, only variables in a package
    软引用不能访问 my 变量,只能访问包变量。
  10. 结果为:,A,,A,AA
    很莫名奇妙?参考此文
  11. 结果为:c,3
    首先参看perldoc -f scalar
    scalar EXPR
    Forces EXPR to be interpreted in scalar context and returns the value of EXPR. 
    
    强制 EXPR 运行在标量上下文下并返回 EXPR 的值。
    
    Because scalar is unary operator, if you accidentally use for EXPR a parenthesized list, this behaves as a scalar comma expression, evaluating all but the last element in void context and returning the final element evaluated in scalar context. 
    
    因为 scalar 是一元算符,所以如果你不小心用于一个 EXPR 括号列表,那么它将表现为标量逗号表达式,在空上下文中运行除了最后一个外的所有元素,并返回在标量上下文下最后元素的结果。
    Comma Operator / 逗号操作符 (来自 perlop)
    
    Binary ``,'' is the comma operator. In scalar context it evaluates its left argument, throws that value away, then evaluates its right argument and returns that value. 
    
    二元 ',' 为逗号操作符。在标量上下文中,它运行左边的参数,然后舍弃结果,运行右边的参数然后返回值。
    
    所以,例如:
    my @x = ('a', 'b', 'c');
    print scalar (1, 2, @x);
    它首先将后面的括号列表表现为逗号表达式,在标量上下文中舍弃 1,2 结果,而后在标量上下文中返回 scalar @x 的结果。
  12. 结果为:
    print  (1 + 4) + 7; # 5
    print +(1 + 4) + 7; # 12
    第一句中的 print 只接收参数(1+4); 如果令 $a = print (1 + 4) + 7; 这时候的 $a 为 8,因为 print 返回 1(运行成功) + 7 = 8
    第二句在括号前加 + 就将括号转为数学运算的括号而不是 print 参数的括号。
  13. 结果为:$x 为 6, $y 为 sort
    首先说明一点,这里的 sort 你可以随便用 xxx 什么的代替。
    其次解释这里 => 的作用, => 称为逗点算符,与 ',' 的作用相同,唯一不一样为 => 强制左边为字符串(参看 perlop)。所以我们就把代码转换为:
    $x = ('sort', (4, 8, 6));
    $y =  'sort', (4, 8, 6);
    本页稍微上面点讲过 scalar. 这里的 $x = 就需要将后面的看做 scalar 上下文。同样的(4, 8, 6)也是 scalar 上下文。
    (4, 8, 6) 在 scalar 上下文中返回的值为 6 (最后一个值在标量上下文的返回)
    $x = ('sort', 6) 将后面强制为标量上下文返回 6
    $y = 'sort', 6 里逗号算符首先将左边计算,所以 $y 为 'sort'; 如果有 $z = ($y = 'sort', (4, 8, 6)); 丢弃左边运算结果,返回 $z = 6;
    这里所有的运算都为标量上下文。请结合 11 一起看。
    同理我们得到下面的结果:
    @a = (0 => 0);
    print $a[0], "-", $a[1]; # 0-0

Reference



blog comments powered by Disqus