中级perl--常见列表操作符

最常用的列表操作符:print sort reserve

print 'Two castaways are ', 'Gilligan',' and ','Skipper',"\n";

my @castaways = sort qw(Gilligan Skipper Ginger ProfessorMary-Ann);

my @castaways = reverse @castaways;

一句话概括,三种操作符的作用:

-- print打印它的参数列表到输出(屏幕或者文件等输出系统)

-- sort对它的参数列表进行排序

-- reverse 对它的参数列表进行逆序排列

2.1、grep列表操作

my @results = grep EXPR, @input_list;

my $count= grepEXPR, @input_list;

解释:grep 依次取@input_list的元素,以EXPR对元素$_进行标量测试,将所有为真的元素返回给列表@results。如果把列表赋值给标量,标量值为返回列表的元素个数(上面最后一例$count)。

my @input_numbers = (1, 2, 4, 8, 16, 32, 64);

my @bigger_than_10 = grep $_ > 10, @input_numbers; # 得到列表(16,32, 64)

my @end_in_4 = grep /4$/, @input_numbers; # 得到列表(4, 64)

my @odd_digit_sum = grep digit_sum_is_odd($_),@input_numbers;# 得到列表(1, 16, 32)

sub digit_sum_is_odd {

    my$input = shift;

    my@digits = split //, $input; # 假定所有字符都是数字

    my $sum;

    $sum += $_ for @digits;

    return $sum % 2;

}

以上三个grep依次分别取@input_numbers所有元素中,大于10的、以4结尾的、数字之和为奇数的元素列表。

第三个例子可以用裸代码块改写函数

my @odd_digit_sum = grep {

    my $sum;

    $sum +=$_ for split //;

    $sum %2;

} @input_numbers;

和之前的grep相比,这里有几个重要的变化:

1、块{}后没有逗号,紧跟一个列表;

2、没有return语句,因为它不是一个函数(若有return,程序报错);

3、因为不是函数,所以直接处理$_,而不需要 shift 进行参数处理

2.2、map列表操作

map 和 grep 的操作方式非常类似,不同的是grep表达式以标量判断的方式对$_进行处理,返回的是参数列表的一部份(判断为真的元素列表);而map表达式以mapping方式对$_进行处理,mapping可以是任意能想到的处理,因此grep可以使用map转换,但map不能使用grep转换。

my @input_numbers = (1, 2, 4, 8, 16, 32, 64);

my @result = map $_ + 100, @input_numbers; # (101,102, 104, 108, 116, 132, 164)

my @result = map { $_,3 * $_ } @input_numbers; # (1, 3,2, 6, 4, 12, 8, 24, 16, 48, 32, 96, 64, 192)

甚至还可以把结果赋值给哈希:

my %hash = @result;#(1=>3, 2=>6, 4=>12, 8=>24, 16=>48, 32=>96, 64=>192)

my %hash = map { $_,3 * $_ } @input_numbers; # 一步到位

如果一个特别的调用返回一个空的列表,map会把空列表连接起来到一个大的列表中,然后扔掉。我们可以利用这个特点选择和丢弃结果。例如,可能我们要以4结尾的数值:

my @result = map {
    my @digits = split //, $_;
    if ($digits[-1] = = 4) {
        @digits;
    } else {
        ( );
    }
} @input_numbers;

提示:所有map和grep能做的事,我们也可以显式的用foreach loop来实现

你可能感兴趣的:(Perl)