【问题标题】:Why is my output printing out twice?为什么我的输出打印两次?
【发布时间】:2013-05-11 19:30:50
【问题描述】:

我编写了一个脚本,它接受一个命令行参数-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;
}

【问题讨论】:

  • 浏览您的代码后,您似乎调用了两次function2,在其中打印在那里和if
  • 对此我还是很陌生。那么使用“if”会导致它实际运行而不仅仅是评估案例?如果是这样,避免这种情况的最佳做法是什么?
  • 是的,每次你调用一个函数时,它都会评估它。我知道这看起来很奇怪。但是如何为函数分配一个变量并在if 中检查呢?任何对你有意义的东西。
  • 调用函数时不必在函数前使用“&”(多年来一直没有必要)。

标签: perl


【解决方案1】:

您调用&function2(@array); 两次,这导致"\n", "@array", "\n" 被打印两次。只需调用一次函数,将返回值存储在变量中,然后测试变量,而不是再次调用函数——或者,更好的是,在这个特定的实例中,您可以完全省去第一次调用。

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 2022-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多