繁体   English   中英

为什么pop / shift无法在perl中使用map / grep

[英]why pop/shift not work with map/grep in perl

我希望在mapgrep操作之后得到第一个或最后一个元素。 使用mapgrep shiftpop操作符似乎不起作用。 有什么建议么? 如果我将map结果保存到数组变量并且弹出那个但我想在一行中执行它,它的工作原理。

:$ cat map.pl 
use strict;
use warnings;
my @arr = (1,2,3,4);
my $ele = pop ( map{10* $_ } @arr ) ;
print "\n element is $ele";
:$ perl map.pl
Not an ARRAY reference at map.pl line 4.
map{10* $_ } @arr

生成一个列表,其元素是@arr相应元素乘以10 不会产生数组。 因此,你不能pop任何东西。 您可以访问最后一个元素:

(map 10 * $_, @arr)[-1]

但是,地图不会改变@arr 如果你想这样做,

 $_ *= 10 for @arr;

map更合适。

shiftpop的第一个参数必须是数组( @NAME@BLOCK ),而不是mapgrep运算符(与数组无关)。

你可以构建一个从中shift / pop的数组。

my $first_ele = shift @{ [ map { 10 * $_ } @arr ] };           # If you want first
my $last_ele  = pop   @{ [ map { 10 * $_ } @arr ] };           # If you want last

但这非常浪费。 您可以使用列表分配或列表切片来避免创建阵列。

my ($first_ele) = map { 10 * $_ } @arr;                        # If you want first
my $first_ele = ( map { 10 * $_ } @arr )[0];                   # If you want first
my $last_ele  = ( map { 10 * $_ } @arr )[-1];                  # If you want last
my ($first_ele, $last_ele) = ( map { 10 * $_ } @arr )[0, -1];  # If you want both

但这仍然是浪费。 当您只想要最后一个产品时,不需要将所有元素相乘。 以下更有意义:

my $first_ele = 10 * $arr[0];                                  # If you want first
my $last_ele  = 10 * $arr[-1];                                 # If you want last
my ($first_ele, $last_ele) = map { 10 * $_ } @arr[0, -1];      # If you want both

在列表上下文中, mapgrep生成列表,但shift / unshiftpush / pop对数组进行操作。 列表和数组在Perl中不是一回事 你不应该担心尝试在一行中做所有事情,而更担心编写正确的代码。

首先还是最后? 首先你可以使用

    use strict;
    use warnings;
    my @arr = (1,2,3,4);
    my ($ele) = map{10* $_ } @arr;
    print "\n element is $ele\n\n";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM