[英]why pop/shift not work with map/grep in perl
我希望在map
和grep
操作之后得到第一个或最后一个元素。 使用map
和grep
shift
和pop
操作符似乎不起作用。 有什么建议么? 如果我将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
更合适。
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
但这非常浪费。 您可以使用列表分配或列表切片来避免创建阵列。
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
在列表上下文中, map
和grep
生成列表,但shift
/ unshift
和push
/ 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.