Perl:遇到最后一个数组元素时断开foreach循环

时间:2014-02-17 21:40:07

标签: mysql arrays perl

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');

2 个答案:

答案 0 :(得分:7)

您可以使用mapjoin

执行此操作
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}}比把这些东西放到引号更好,因为它会为你处理坏事。 mapforeach循环没有太大区别,而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);   
}

http://bobby-tables.com/perl.html