perl - 'keys'和'map'的组合有什么作用?

时间:2013-10-29 21:27:44

标签: perl

我对perl没有任何经验。我试图理解这句话:

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;

它做了什么?

3 个答案:

答案 0 :(得分:7)

让我们分析一下这个表达式:

map {qq[ `$_` = ? ]} keys %$event;
  • %$event取消引用存储在$event变量中的hashref

  • keys %$event检索此哈希的所有键(作为列表)

  • map { /*someexpr*/ } keys %$event根据keys函数返回的列表创建新列表。此新列表的每个元素都是/ someexpr /返回的元素。后者将针对旧列表的每个元素进行评估,并在$_中包含此元素。

所以现在唯一令人费解的元素是qq[ `$_` = ? ]表达式。但这对decypher来说也很简单:qq实际上是双字符串引用运算符。引用doc

  

虽然我们通常将引号视为字面值,但在Perl中它们   作为运算符,提供各种插值和   模式匹配功能。 Perl提供惯用报价   这些行为的字符,也为您提供了一种方式   选择你的任何一个的引用字符。

在这种特殊情况下,[]符号用作分隔符。该表达式的结果与...基本相同。

"`$_` = ?"

简而言之,此函数采用hashref,其中每个元素的键是一个字段名称,其值是插入此字段的值,并生成一个准备好的INSERT查询($sql)以及要绑定到此查询的值数组(values %$event)。

答案 1 :(得分:1)

该行

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

相当于:

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

答案 2 :(得分:0)

这些行:

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

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

生成SQL预处理语句的一部分,其中键作为字段名称,问号作为要替换的值。