1

我对 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;

它有什么作用?

4

3 回答 3

7

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

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

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

  • map { /*someexpr*/ } keys %$event根据keys函数返回的列表创建一个新列表。这个新列表的每个元素都是 / someexpr / 返回的元素。后者针对旧列表的每个元素进行评估,该元素位于$_.

所以现在唯一令人费解的元素是qq[ `$_` = ? ]表达。但这也很容易解密:qq实际上是一个双字符串引号运算符。引用文档

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

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

"`$_` = ?"

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

于 2013-10-29T21:35:22.677 回答
1

线

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

相当于:

my @pairs;
for my $tmp (keys %$event) {
    push @pairs, " `" . $tmp . "` = ? "
}
于 2013-10-29T21:39:00.493 回答
0

这些行:

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

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

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

于 2013-10-29T21:35:06.190 回答