【问题标题】:Perl: Breaking out of foreach loop when last array element is encounteredPerl:遇到最后一个数组元素时打破foreach循环
【发布时间】:2014-03-17 09:09:27
【问题描述】:

这里是 Perl 菜鸟。我有一个小脚本(见下文),用于构建 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');

【问题讨论】:

  • 你会一直拥有三个记录吗?
  • 不,这只是一个简化的例子。实际数组将来自多个不同来源中的任何一个,并且数组长度会有所不同。
  • 查看这里:stackoverflow.com/questions/303216/…你可以拨打last;

标签: mysql arrays perl


【解决方案1】:

您可以使用 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

$dbhquote method 比仅仅将内容放在引号中要好,因为它会为您处理不好的内容。 mapforeach 循环没有太大区别,join 将负责将逗号放在元素之间,而不是最后一个。

【讨论】:

  • 这绝对是一个更优雅的解决方案,但是,现在我收到了错误Global symbol "$record" requires explicit package name$record 变量定义在哪里?
  • 感谢您修复 @tobyink。我正要这样做。
  • 我认为$record 应该是$_,所以相应地编辑了答案。
  • $insert .= ';'; 可以完全省略。
  • @ikegami 是的。我把它明确地放在那里,因为 OP 在所需的输出中有它。
【解决方案2】:

在一个相关的事情上,我总是尽量避免将数据和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

【讨论】:

  • 虽然这是一个很好的建议,但它不适用于这个问题。 OP 专门询问如何将所有行放入一个 INSERT 语句中。对于具有严重性能影响的大量数据,因为我们有一个事务而不是很多事务。 prepare 内部在每个 ? 值上使用 quote,如果列(或行)数可变,则需要这样做。
猜你喜欢
  • 2019-10-22
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 2010-10-14
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多