2013-05-10 109 views
0

我写了一个脚本,它采用命令行参数-s,并允许我在其后添加搜索词。为什么我的输出打印出两次?

然后,它将它馈送到我的第一个函数中,连接到SQL数据库,搜索该术语,并将结果返回到数组中。

然后,它调用第二个函数,打印数组并输出-10,具体取决于是否找到任何结果。

最后,它应该检查结果是否不等于0,如果是,则打印出未找到结果。

一切正常,但我的结果打印两次。任何想法为什么?

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

getopt('s:'); 
our ($opt_s); 
my $search = $opt_s; 

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

&function2(@array); 
if (&function2(@array) != 0) { 
    print "No results found for '$search'", "\n"; 
} 

sub function1 { 
    my $search = $_[0]; 

    our $dbh = DBI->connect("dbi:mysql:dbname=database", "root", "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 @array = @_; 
    my $arrayvalue; 

    print("\n", "@array", "\n"); 

    if (scalar(@array) == 0) { 
     $arrayvalue = -1; 
    } 
    else { 
     $arrayvalue = 0; 
    } 

    return $arrayvalue; 
} 
+3

跳过代码后,看起来像调用'function2'两次,在其中打印并在'if'中打印。 – squiguy 2013-05-10 20:46:23

+0

我对此仍然非常陌生。因此,使用“if”会导致它实际运行,而不仅仅是评估案例?如果是的话,避免这种情况最好采取什么行动? – user2361820 2013-05-10 20:48:29

+0

是的,每次你调用一个函数,它都会评估它。我知道这似乎很奇怪。但是,如何为函数分配一个变量并检查你的'if'?无论对你有意义。 – squiguy 2013-05-10 20:51:13

回答

1

你打电话&function2(@array);两次,这会导致"\n", "@array", "\n"被打印两次。只需调用函数一次,将返回值存储在一个变量中,然后测试变量而不是再次调用函数 - 或者,更好的是,在这个特定的情况下,您可以完全免除第一次调用。

+0

完美,谢谢 – user2361820 2013-05-10 20:51:58