2017-07-12 6 views
2

mapgrepオペレーション アレイの最初または最後の要素を取得したいのですが。 shiftpopの演算子をmapgrep と使用しても動作しないようです。助言がありますか? map の結果を配列変数に保存してポップしても、1行でやりたいと思っています。なぜpop/shiftがperlのmap/grepで動作しないのですか

:$ 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. 
+6

、 'map'と' grep'農産物リストが、 'shift' /' unshift'と 'push' /' pop'は、アレイ上で動作します。以下は、はるかに理にかなっています。リストと配列はPerlでは同じものではありません。すべてを1行でやってみることに心配する必要はなく、正しいコードを書くことを心配する必要があります。 –

+1

@MattJacob私はそれが質問への良い答えだと思った – ysth

+0

マットヤコブの答え(良いが削除?)からの良いリンク:[list vs array](https://stackoverflow.com/questions/14001741/what-リストと配列の違いです) – zdim

答えて

6
map{10* $_ } @arr 

その要素10乗じ@arrの要素に対応しているリストを生成します。 は配列を生成しません。したがって、あなたはそれから何もpopすることはできません。あなたはしかし、最後の要素にアクセスすることができます

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

ただし、マップが@arrは変更されません。そうしたい場合は、

$_ *= 10 for @arr; 

mapより適切です。

3
リストコンテキストで

mapgrep農産物リストが、shift/unshift及びpush/popは、アレイ上で動作します。 Lists and arrays are not the same thing in Perl。すべてを1行でやってみることに心配する必要はなく、正しいコードを書くことを心配する必要があります。

1

最初か最後か?最初にあなたが

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

OPは、最初と最後の両方に言及し、シフトとポップの両方を言い表すことができるようにしたいと考えられます。私はそれを明確にするためにOPを調整した。 – ikegami

6

を使用することができますについてshiftpopの最初の引数は、配列(@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 
関連する問題