使用从数组 ref 中获取的元素评估 perl 中的相等性
Posted
技术标签:
【中文标题】使用从数组 ref 中获取的元素评估 perl 中的相等性【英文标题】:Evaluating equality in perl using elements taken from an array ref 【发布时间】:2011-11-13 02:06:45 【问题描述】:我有一个小的 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,这不是我想要的。
我做错了什么?
【问题讨论】:
究竟什么是“ARRAY(...) 0 9020
”? $firstId
和 $secondId
?如果是这样,您可能应该向我们提供有关这些值来自何处的更多信息。
$firstId 和 $secondId 是以数组的形式返回的。
【参考方案1】:
DBI::fetchall_arrayref
返回对“行结果”列表的引用。但是由于行结果中可能有多个值(例如,您的查询可能是select id,other_field from pictures
),因此每个行结果也是对列表的引用。这意味着您还需要进行一次取消引用才能获得您想要的结果。试试:
$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;
【讨论】:
我本可以发誓我曾尝试过这样做,但我想不会。这正是我想要的。谢谢!以上是关于使用从数组 ref 中获取的元素评估 perl 中的相等性的主要内容,如果未能解决你的问题,请参考以下文章