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

Ame*_*eyj 2 perl

我想获得数组后的第一个或最后一个元素mapgrep操作.使用shiftpop与运营商mapgrep 似乎并没有工作.有什么建议?它可以工作,如果我将结果保存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.
Run Code Online (Sandbox Code Playgroud)

Sin*_*nür 6

map{10* $_ } @arr
Run Code Online (Sandbox Code Playgroud)

生成一个列表,其元素是@arr乘以的相应元素10.它不会产生数组.因此,你pop无法解决任何问题.您可以访问最后一个元素:

(map 10 * $_, @arr)[-1]
Run Code Online (Sandbox Code Playgroud)

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

 $_ *= 10 for @arr;
Run Code Online (Sandbox Code Playgroud)

比较合适map.


ike*_*ami 6

第一个参数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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)