Perl noob在这里。我有一个小脚本(见下文),我用它来构建一个MySQL INSERT语句。
use strict;
my @records = qw/Record1 Record2 Record3/;
my $insert = "
INSERT INTO table
VALUES
";
foreach my $record (@records) {
$insert .= "('" . $record . "'),\n ";
}
print "$insert\n";
当前输出
INSERT INTO table
VALUES
('Record1'),
('Record2'),
('Record3'),
我需要知道如何在@records
数组的最后一个元素处中断并添加;
而不是,
期望输出
INSERT INTO table
VALUES
('Record1'),
('Record2'),
('Record3');
答案 0 :(得分:7)
您可以使用map
和join
。
my @records = qw/Record1 Record2 Record3/;
my $insert = "
INSERT INTO table
VALUES
";
$insert .= join ',', map { '(' . $dbh->quote($_) . ')' } @records;
$insert .= ';'; # this line is not needed
$dbh
的{{3}}比把这些东西放到引号更好,因为它会为你处理坏事。 map
与foreach
循环没有太大区别,而join
会将逗号放在元素之间,而不是最后一个。
答案 1 :(得分:1)
在相关的问题上,我总是尽量避免将数据和sql语句放在同一行,从而最大限度地降低了sql注入的风险。在perl中,您可以使用准备/执行机制:
my @records = qw/Record1 Record2 Record3/;
$sth = $dbh->prepare("INSERT INTO table VALUES ?");
foreach my $record (@records) {
$sth->execute($record);
}