我对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;
它做了什么?
答案 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预处理语句的一部分,其中键作为字段名称,问号作为要替换的值。