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

She*_*rSt 1 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 );
}
Run Code Online (Sandbox Code Playgroud)

$self->get_event_table()在这种情况下,返回字符串"pbs".$event我相信,它包含一堆任意的键值对.我很困惑

my @pairs = map {qq[ `$_` = ? ]} keys %$event;
Run Code Online (Sandbox Code Playgroud)

它有什么作用?

rai*_*7ow 7

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

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

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

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

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

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

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

"`$_` = ?"
Run Code Online (Sandbox Code Playgroud)

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

  • 请记住,`map`采用一个列表并返回另一个列表.`map`中的东西决定了输入列表的转换方式. (2认同)