使用从数组 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 中的相等性的主要内容,如果未能解决你的问题,请参考以下文章

Perl - 将两个数组“拉链”在一起的内置函数?

无法使用 refs 从 render() 方法中获取 HTML 元素

Vue中ref和$refs的介绍及使用

如何获取使用 .map 呈现的第一个元素的 ref?

在 Perl 中计算稀疏数组中的元素

Perl 中的正则表达式组:如何从正则表达式组中捕获与字符串中出现的未知数量/多个/变量匹配的元素到数组中?