perl 的一些面试题

  1. 列表和数组有什么区别?

数组可以改变length,而列表不可以。数组可以push或者pop,而列表不可以,它是一些值的集合。数组在scalar上下文中返回其length,而列表返回最右边的值,例如:

$scalar = (2,5,7,9); # $scalar 被赋值为 9

2. require 和 use 有什么区别?

Perl 在运行时间执行 "require" 语句。在编译时间执行 "use" 语句,而且会调用加载包的 "import" 方法。下面两段代码一样:

use MODULE qw(import list);

BEGIN {
    require MODULE;
    MODULE->import(import list);
}

更清楚的例子:

use URI::Escape;

my $url = "http://www.amazon.cn";
my $escape = uri_escape($url); # uri_escape 方法默认导入
print $escape, "\n";


require URI::Escape;
URI::Escape->import(uri_escape); # uri_escape 方法需要 import 才导入

my $url = "http://www.amazon.cn";
my $escape = uri_escape($url);
print $escape, "\n";

3. my 和 local 有什么区别?

"local" 仅仅是给全球变量(meaning package)一个临时的值,并不是创建一个local变量。"my" 则表明创建一个私有变量。

在一个方法中,local $x 会给全球变量 $x 一个临时的值,当在这个方法中调用别的方法的时候,别的方法中 $x 会保留这个值。

而 my $x 仅在所在方法中可见。

#!/usr/bin/perl
use strict;
use warnings;
our $x; # 全球变量

$x = "123";

sub foo {
    local $x = "456";
    print "x in sub foo $x\n"; # $x 为 456
    bar(); # 在 foo 中调用 bar
}

sub bar {
    print "x in sub bar $x\n"; # bar 是 foo 调用的,所以 $x 还是 456
}

foo();

print "x in main: $x\n"; # $x 是 123

这篇文章: 有用 无用