爲什麼以下有效?爲什麼映射參數之間不需要逗號?
my @ys = map { $_ * $_ } @xs;
以下無效?
my @ys = map { $_ * $_ }, @xs;
是map
一種語言結構,不是一個真正的功能,或在那裏爲塊特殊規則?
爲什麼以下有效?爲什麼映射參數之間不需要逗號?
my @ys = map { $_ * $_ } @xs;
以下無效?
my @ys = map { $_ * $_ }, @xs;
是map
一種語言結構,不是一個真正的功能,或在那裏爲塊特殊規則?
map
是列表操作和核心功能。這是簡單的Perl語法,在子程序的塊參數後面沒有逗號。關於map
的特別之處在於它也可以採用表格map EXPR, LIST
。如果這與標準子程序一起使用,EXPR
將僅作爲第一個參數進行評估和傳遞。
塊參數對所有子程序均有效,如果將原型應用於子程序定義,則可以使用該參數。例如,你可以定義一個mymap
,通過編寫的表現用同樣的方法
use strict;
use warnings;
use 5.010;
sub mymap(&@) {
use Data::Dump;
my $sub = shift;
my @newlist;
push @newlist, $sub->($_) for @_;
@newlist;
}
say for mymap { $_ * $_ } 1, 2, 3;
輸出
1
4
9
但總的來說,你應該避免原型,除非你知道正是你是做。通常有更好的方法來編寫你的代碼。
是的,map
是一種語言結構。
像grep
,it supports two different syntaxes:
在您的示例BLOCK
只是一個簡單的表達,所以這兩個語句是等價的:
my @ys = map { $_ * $_ } @xs;
my @ys = map $_ * $_, @xs;
它是一個運算符,每個運算符定義它自己的語法。 Perl爲子程序提供的工具也可以做到這一點。
的perlfunc開口行是:
本節中的功能可以作爲在表達方面。它們分爲兩大類:列表運算符和命名的一元運算符。
因此,雖然map
是不是在C感測—那些被稱爲在Perl —子程序它是由Perl的定義函數的函數。
所以map
是一個運算符。運營商有很多,從子程序調用子程序不同:
substr
(後面必須有1〜4逗號分隔的表達式)time
(不能給出一個參數列表)map BLOCK LIST
print BLOCK LIST
delete HASH_ELEMENT
push ARRAY, LIST
lc
(當提供主叫範圍的$_
)EXPR + EXPR
子程序可以匹配或近似使用原型命名運算符的語法(例如sub mypush(\@@)
)和Devel :: CallParser(例如loop
)。
這些情況下的「爲什麼」是「因爲拉里決定這樣做」。 :) –