在Perl中传递多个数组,字符串参数

时间:2017-04-29 00:19:42

标签: perl

我是Perl编程的初学者,我想了解Perl中的OOP。我开发了一个关于sql creator的简单应用程序,但是我有一个问题。我认为问题是传递多个参数。

False

这是我的示例代码。如果你解决了这个问题,请帮助我。

1 个答案:

答案 0 :(得分:7)

您不能将数组传递给subs,只传递标量。当你这样做

starttime = (dbNullCheck.isColumnNull(rdr, "start_time")) ? new DateTime() : rdr.GetDateTime(4);
endtime = (dbNullCheck.isColumnNull(rdr, "end_time")) ? new DateTime() : rdr.GetDateTime(5);

您将以下内容传递给方法:

my $sql = $object->createInsertSql(
    'person', @column, @value );

在方法内,你有

$object, 'person', $column[0], $column[1], ..., $value[0], $value[1], ...

首先,您忘记了对调用者的说明。应该有一个前导my ( $table, @column, @value ) = @_; 参数。

其次,无法知道要添加到$self的标量数量和添加到@column的标量数量,因此除了第一个之外的所有标量都添加到@value。< / p>

这意味着您有效地执行了以下操作:

@column

如果要传递数组,请将引用传递给它。

my $table  = $object;
my @column = ( 'person', $column[0], $column[1], ..., $value[0], $value[1], ... );
my @value  = ();

子变为

my $sql = $object->createInsertSql( 'person', \@column, \@value );

顺便说一下,你的代码充满了注入错误。您没有正确地将文本转换为SQL标识符和SQL字符串文字。

修正:

sub createInsertSql {
    my ( $self, $table, $column, $value ) = @_;
    my $sql = 'INSERT INTO '.$table;           # XXX Injection bug
    $sql .= createInsertColumn(@$column);
    $sql .= createInsertValue(@$value);
    return $sql;
}

package SqlCreator;

use warnings;
use strict;

sub new {
    my ( $class, %args ) = @_;
    return bless \%args, $class;
}

sub createInsertSql{
    my ( $self, $table, $cols, $vals ) = @_;

    my $dbh = $self->{dbh};

    return sprintf(
        'INSERT INTO %s ( %s ) VALUES ( %s )'
        $dbh->quote_identifier($table),
        ( join ', ', map { $dbh->quote_identifier($_) } @$cols ),
        ( join ', ', map { $dbh->quote($_)            } @$vals ),
    );
}

1;