2013-05-10 6 views
0

Я написал сценарий, который принимает аргумент командной строки -s, и позволяет мне добавить поисковый запрос после него.Почему мой вывод печатает дважды?

Затем он передает это в мою первую функцию, подключается к базе данных SQL, ищет этот термин и возвращает результаты в массиве.

Затем он вызывает вторую функцию, печатает массив и выводит -1 или 0 в зависимости от того, были ли найдены какие-либо результаты.

И, наконец, предполагается, что результат не равен 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

+0

Я по-прежнему очень новичок в этом. Таким образом, использование «if» заставляет его фактически запускать, а не просто оценивать дело? Если да, то каков наилучший способ избежать этого? – user2361820

+0

Да, каждый раз, когда вы вызываете функцию, она будет ее оценивать. Я знаю, это кажется странным. Но как насчет того, чтобы назначить переменную функции и проверить ее в 'if'? Все, что имеет смысл для вас. – squiguy

ответ

1

Вы звоните &function2(@array); дважды, что вызывает "\n", "@array", "\n" быть напечатана дважды. Просто вызовите функцию один раз, сохраните возвращаемое значение в переменной и протестируйте переменную, а не снова вызовите функцию - или, что еще лучше, в этом конкретном экземпляре, вы можете просто отказаться от первого вызова полностью.

+0

Отлично, спасибо – user2361820

Смежные вопросы