簡體   English   中英

如何將Perl數組作為標量傳遞到子例程中?

[英]How do I pass a Perl array as a scalar into a subroutine?

這是一位新生的Perl開發者。 我一直在wra my my and and and and ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...

我有以下代碼(只剩下相關部分),因為其余的工作):

my @arrMissingTids;
@arrMissingTids = %hshTids;

my $missingtid;
foreach $missingtid (@arrMissingTids) {
    print "$missingtid\n";
}

這很好用,返回我想要在數組中的值:

500000246,500000235,500000185,500000237,500000227,500000252

但是,當我將它傳遞給子程序並將其包含在變量名中時,它不提供上面所寫的列表,而只是提供數字1.代碼如下:

myqry(@arrMissingTids);

sub myqry($) {

    my $missingtids = @_;

    $sql = "select 
        i.tid i_tid, i.name i_name
        from 
        instrument i
        where i.tid in ($missingtids)";

    print "$sql/n";
}

打印$ sql返回以下內容:

Select i.tid i_tid, i.name i_name from instrument i where i.tid in (1)

當我希望它返回以下內容時:

Select i.tid i_tid, i.name i_name from instrument i where i.tid in (500000246,500000235,500000185,500000237,500000227,500000252)

提前感謝任何正確方向的指針!

這里有三個問題。 第一個是使用函數原型,只是把它留下,看看為什么Perl 5的函數原型不好?

第二個是函數調用中類型和函數本身的接收方不匹配。 兩次使用數組,或兩次使用數組引用。

第三是將數據視為SQL查詢的一部分,可能為SQL注入攻擊打開了大門 通過將查詢字符串與占位符組合在一起以便與DBI一起使用,可以安全地減輕這種情況。

myqry(@arrMissingTids);
sub myqry {
    my @missingtids = @_;
    $sql = "select
        i.tid i_tid, i.name i_name
        from
        instrument i
        where i.tid in (" . join(',', ('?') x @missingtids) . ")";
    print "$sql\n";
    # $dbh->selectall_arrayref($sql, {}, @missingtids)
}

myqry(\@arrMissingTids);
sub myqry {
    my @missingtids = @{ shift() };
    $sql = "select
        i.tid i_tid, i.name i_name
        from
        instrument i
        where i.tid in (" . join(',', ('?') x @missingtids) . ")";
    print "$sql\n";
    # $dbh->selectall_arrayref($sql, {}, @missingtids)
}

如果有人還沒有提到它,這里的原型是一個問題:

sub myqry($) {

考慮一下:

sub test1($) {
    print "$_\n" foreach @_;
}

sub test2 {
    print "$_\n" foreach @_;
}

my @args = ('a', 'b', 'c');

test1(@args);
test2(@args);      

和輸出:

3
a
b
c

到目前為止,您已經意識到標量上下文中的數組只是元素的數量,例如:

my $n = @args;

$n是3.通過將數組傳遞給子程序,將其減少為標量,最終得到一個arg,即數組中的元素數。 然后你這樣做:

my $missingtids = @_;

由於子定義中的($) ,數組總是只有一個(數組已經減少到一個元素)。 因此,你得到1

0.02美元:perl中的IMO原型是一個壞主意;)

問題就在這里:

my $missingtids = @_;

你在標量上下文中調用數組@_ 這意味着你要為$missingtids分配@_中元素的數量。 解決此問題的一種方法是傳遞數組引用:

sub myqry {

    my $missingtids_ref = shift;
    my @missingtids=@$missingtids_ref;

    $sql = "select 
        i.tid i_tid, i.name i_name
        from 
        instrument i
        where i.tid in (" . join(",",@missingtids) . ")";

    print "$sql/n";
}

有關更多信息,請查看perldoc perlrefperldoc perldata

所以你想創建字符串

... in (1,2,3,4)

使用join

myqry(join(',', @arrMissingTids))

但那是內而外的。 這會更好:

sub myqry {
    my $missingtids = join(',', @_);

    return "select 
        i.tid i_tid, i.name i_name
        from 
        instrument i
        where i.tid in ($missingtids)
    ";
}

myqry(@arrMissingTids);

謝謝你的幫助。 畢竟說完了之后,我最終擺脫了原型並使用了這個代碼,這個代碼完美無缺,並且從上面的所有幫助拼湊而成:

myqry(@arrTids);

sub myqry {
   $missingtids = join(",",@_);

   .rest of code...
}

未經測試,但可能是正確的:

myqry(\@arrMissingTids);

sub myqry($) {

    my $missingtids = shift; # or $_[0]

    $sql = "select 
        i.tid i_tid, i.name i_name
        from 
        instrument i
        where i.tid in (" . join(',', @{$missingtids}) . ")";

    print "$sql/n";
}

當然你可以傳遞數組本身而不是引用,但是你需要更改原型並重寫數組引用。 但上面的東西應該讓你去。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM