-1

私は 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;

}
4

1 に答える 1

4

このコードには多くの問題があります (コンパイルできないなどの主要な問題から、実行時エラーがどのように発生するかさえわかりません) から、小さなスタイル上の問題まであります。

ただし、変数の受け渡しについて話しているので、その部分に焦点を当てます。


関数を呼び出す場所は次のとおりです。

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

したがって、最初に引数なしで呼び出しfunction1(検索文字列を渡さなかったため、おそらく正しく実行されずuninitialized value $search in concatenation、コメントで言及したエラーが発生しました)、空の配列結果を に割り当てます@array

次に、今度は正しく ($search パラメーターを渡す) をfunction1 再度呼び出しますが、戻り値は無視します (したがって@array、最初の呼び出しから空のままになります)。

2番目の機能についても同じ問題。

これは次のようになっているはずです。

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

2 番目の大きな問題は、データを配列として 2 番目の関数に渡しているが、関数内でそれをスカラーとして割り当てていることです (おそらく、配列参照を渡した場合と同様です)。

あなたのコード:

# 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
于 2013-05-10T17:33:03.533 に答える