我想获得数组后的第一个或最后一个元素map和grep操作.使用shift并pop与运营商map和grep
似乎并没有工作.有什么建议?它可以工作,如果我将结果保存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)
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.
第一个参数shift和pop必须是数组(@NAME或@BLOCK),而不是map或grep运算符(与数组无关).
你可以构建一个从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)