2013-09-26 57 views
4

爲什麼以下有效?爲什麼映射參數之間不需要逗號?

my @ys = map { $_ * $_ } @xs; 

以下無效?

my @ys = map { $_ * $_ }, @xs; 

map一種語言結構,不是一個真正的功能,或在那裏爲塊特殊規則?

+1

這些情況下的「爲什麼」是「因爲拉里決定這樣做」。 :) –

回答

3

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 

但總的來說,你應該避免原型,除非你知道正是你是做。通常有更好的方法來編寫你的代碼。

8

是的,map是一種語言結構。

grepit supports two different syntaxes

​​

在您的示例BLOCK只是一個簡單的表達,所以這兩個語句是等價的:

my @ys = map { $_ * $_ } @xs; 
my @ys = map $_ * $_, @xs; 
0

它是一個運算符,每個運算符定義它自己的語法。 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)。

相關問題