2013-10-29 37 views
1

我真的沒有任何perl的經驗。我試圖理解這種說法:perl - 'keys'和'map'的組合是做什麼的?

sub get_insert_query { 
    my ($self, $event) = @_; 
    my $table = $self->get_event_table(); 
    my $sql = qq[ INSERT INTO $table SET ]; 
    my @pairs = map {qq[ `$_` = ? ]} keys %$event; 
    $sql .= join(',', @pairs); 
    return ($sql, values %$event); 
} 

$self->get_event_table(),在這種情況下,返回字符串「PBS」。我相信,$event包含一串任意的鍵值對。我很困惑

my @pairs = map {qq[ `$_` = ? ]} keys %$event; 

它是做什麼的?

+0

'的perldoc -f keys'和'的perldoc -f map' – toolic

回答

7

我們來分析一下這個表達式:

map {qq[ `$_` = ? ]} keys %$event; 
  • %$event取消引用存儲在$event可變

  • keys %$event一個hashref檢索該哈希的所有鍵(如列表)

  • map { /*someexpr*/ } keys %$event根據01返回的列表創建一個新列表功能。這個新列表中的每個元素都是由/ someexpr /返回的元素。後者針對舊列表中的每個元素進行評估,在$_中包含此元素。

所以現在唯一令人費解的元素是qq[ `$_` = ? ]表達式。但是這也很簡單:qq實際上是一個雙字符串引號運算符。引述doc

雖然我們通常認爲的報價爲面值,在Perl他們 功能爲運營商,提供各種插值和 模式匹配功能。 Perl爲這些行爲提供了習慣性的報價 字符,但也爲您提供了一種方法,讓您爲 選擇您的任何字符。

在此特定情況下,[]符號被用作分隔符。此表達式的結果是基本相同...

"`$_` = ?" 

總之,該功能需要一個hashref,其中每個元素的鍵是一個字段名,並且它的值是,那麼,一個值,以插入此字段,並生成準備好的INSERT查詢($sql)以及值數組以綁定到此查詢(values %$event)。

+0

1。 '地圖'總是讓我害怕。不過,你的解釋很棒。 – slayedbylucifer

+2

只要記住'map'需要一個列表並返回另一個列表。 'map'內的東西決定了輸入列表如何轉換。 – friedo

0

這些行:

my @pairs = map {qq[ `$_` = ? ]} keys %$event; 

    $sql .= join(',', @pairs); 

生成SQL的部分製備的語句鍵作爲字段名和問號的值來取代。

1

my @pairs = map {qq[ `$_` = ? ]} keys %$event; 

相當於:

my @pairs; 
for my $tmp (keys %$event) { 
    push @pairs, " `" . $tmp . "` = ? " 
}