当我尝试通过函数传递变量时遇到困难

时间:2013-05-10 16:34:10

标签: sql perl

我是Perl的新手并做了一些需要我通过函数输入和输出变量的练习。我使用全局变量创建了相同的脚本,并且它有效,但在我尝试使用my之后,并将所有内容设置为严格,我遇到了一堆问题。我的语法是否关闭?还是更基本的东西?任何帮助将不胜感激:

#!/usr/bin/perl -w
use warnings;
use strict;
use DBI;
use Getopt::Std;

getopt('s:');
my $opt_s;
my $search = $opt_s;
my @array = &function1();
my $arrayvalue = &function2();
&function1($search);
&function2(@array);
if (&function2(@array) != 0 {
    print "no values found for '$search'","\n"};

sub function1 {

my search = $_[0];
our $dbh = DBI->connect("dbi:mysql:dbname=database, "user", "password")
    or die $DBI::errstr;
my $sql = $dbh->selectall_arrayref("SELECT Player from Players_Sport where Sport like '$search'")
or die $DBI::errstr;
my @array = map { $_->[0] } @$sql;
$dbh->disconnect
    or warn "Disconnection failed: $DBI::errstr\n";
return @array;
}

sub function2 {
my $arrayvalue=()
my @array = $_[0];
print join("\n", @array, "\n");
if(scalar (@array) == 0) {
    $arrayvalue = -1;
}
    else {$arrayvalue = 0;
};
return $arrayvalue;

}

1 个答案:

答案 0 :(得分:4)

这段代码存在很多问题(从主要的不可编译,因此我甚至不知道你如何得到运行时错误),以及轻微的风格问题。

然而,既然你谈到了变量传递,那么我将把它归零。


您可以在此处调用您的功能:

my @array = &function1();
my $arrayvalue = &function2();
&function1($search);
&function2(@array);

所以,你首先调用function1没有参数(可能会错误地运行,因为你没有传递搜索字符串 - 导致你在评论中提到的uninitialized value $search in concatenation错误),并且将空数组结果分配到@array

然后,您再次拨打function1 ,这次正确(传递$ search参数),但忽略返回值(因此@array将在第一次调用时保持为空。

第二功能的问题相同。

这应该是:

my @array = function1($search);
my $arrayvalue = function2(@array);

第二个大问题是,您将数据作为数组传递给第二个函数,但在函数内部将其指定为标量(可能就像您传递了数组引用一样)。

您的代码:

# Called via "function2(@array)";
my @array = $_[0];

如果要传递数组,则需要将参数数组作为整个数组进行处理:

# Called via "function2(@array)";
my @array = @_; 

然而,如果您打算通过引用传递,作为单个数组引用参数(这是一种技术更高级,但由于各种原因而强烈推荐传递数组):

# Called via "function2(\@array)";
# Notice the "\" in front of "@" - this is a "take a reference" operator
my $arrayRef = $_[0]; # We only take 1 parameter, the array reference, now
my @array = @$arrayRef; # Dereference array ref into an array. 
# You can also use arrayref directly instead once you learn about data structures