1

2 つのパラメーターの等価性とデータベースからの小さなリターンを評価する必要がある小さな perl スクリプトがあります。

my ($firstId, $secondId, $firstReturnedId, $secondReturnedId, $picCount);
my $pics = $dbh->prepare(qq[select id from pictures limit 10]);

$firstId = q->param('firstId');
$secondId = q->param('secondId');

$pics->execute or die;
my $picids = $pics->fetchall_arrayref;

$picCount = scalar(@{$picids});
$firstReturnedId = $picCount > 0 ? shift(@{$picids}) : 0;
$secondReturnedId = $picCount > 1 ? pop(@{$picids}) : $firstReturnedId;

ここで、デバッガーをざっと見てみると、$picCount = 1、$firstReturnedId = 9020、$secondReturnedId = 9020 であることがわかります。ただし、どちらも次のように示されています。

ARRAY(0x9e79184)
0 9020

デバッガーで最終チェックを実行すると

my $result = (($firstId == $firstReturnedId) && ($secondId == $secondReturnedId)) ? 1 : 0;

私は $result = 0 を取得しますが、これは私が望むものではありません。

私は何を間違っていますか?

4

1 に答える 1

3

DBI::fetchall_arrayref「行の結果」のリストへの参照を返します。ただし、行の結果には複数の値が含まれる可能性があるため (たとえば、クエリが である可能性がありますselect id,other_field from pictures)、各行の結果はリストへの参照でもあります。これは、目的の結果を得るために、もう 1 つの逆参照を行う必要があることを意味します。試す:

$picCount = scalar(@{$picids});
if ($picCount > 0) {
    my $result = shift @{$picids};
    $firstReturnedId = $result->[0];
} else {
    $firstReturnedId = 0;
}
if ($picCount > 1) {
    my $result = pop @{$picids};
    $secondReturnedId = $result->[0];
} else {
    $secondReturnedId = $firstReturnedId;
}

または、簡潔なスタイルを使用したい場合:

$firstReturnedId = $picCount > 0 ? shift(@{$picids})->[0] : 0;
$secondReturnedId = $picCount > 1 ? pop(@{$picids})->[0] : $firstReturnedId;
于 2011-09-08T15:47:18.087 に答える