我对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)
它有什么作用?
让我们分析一下这个表达式:
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).
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |