【发布时间】:2010-06-14 02:07:40
【问题描述】:
我正在处理我之前发布的问题 (here),并尝试将答案转换为 sub,以便我可以多次使用它。不确定它是否正确完成。谁能提供更好或更清洁的潜艇?
我有很多编程经验,但我的主要语言是 PHP。知道如何用一种语言执行,却不能用另一种语言执行,这令人沮丧。
sub search_for_key
{
my ($args) = @_;
foreach $row(@{$args->{search_ary}}){
print "@$row[0] : @$row[1]\n";
}
my $thiskey = NULL;
my @result = map { $args->{search_ary}[$_][0] } # Get the 0th column...
grep { @$args->{search_in} =~ /$args->{search_ary}[$_][1]/ } # ... of rows where the
0 .. $#array; # first row matches
$thiskey = @result;
print "\nReturning: " . $thiskey . "\n";
return $thiskey;
}
search_for_key({
'search_ary' => $ref_cam_make,
'search_in' => 'Canon EOS Rebel XSi'
});
---编辑---
从目前的答案来看,我拼凑了下面的函数。我是 Perl 的新人,所以我不太了解其中的语法。我所知道的是它会引发关于该 grep 行的错误(不是第 26 行的 ARRAY 引用。)。
由于我似乎没有提供足够的信息,所以我还要提一下:
我这样调用这个函数(可能正确也可能不正确):
search_for_key({
'search_ary' => $ref_cam_make,
'search_in' => 'Canon EOS Rebel XSi'
});
$ref_cam_make 是我从数据库表中收集的一个数组,如下所示:
$ref_cam_make = $sth->fetchall_arrayref;
它的结构是这样的(如果我了解如何使关联提取正常工作,我想像那样使用它而不是数字键):
Reference Array
Associative
row[1][cam_make_id]: 13, row[1][name]: Sony
Numeric
row[1][0]: 13, row[1][1]: Sony
row[0][0]: 19, row[0][1]: Canon
row[2][0]: 25, row[2][1]: HP
sub search_for_key
{
my ($args) = @_;
foreach my $row(@{$args->{search_ary}}){
print "@$row[0] : @$row[1]\n";
}
print grep { $args->{search_in} =~ @$args->{search_ary}[$_][1] } @$args->{search_ary};
}
【问题讨论】:
-
您在脚本/模块的顶部缺少
use strict; use warnings;。它将捕获许多错误并使您看到的诊断更有帮助(当您的示例代码中已经修复了这些简单错误时,SO 上的人更有可能为您提供帮助)。 -
@Ether ...此代码是从较大脚本中复制粘贴的。我在完整脚本中使用了严格和警告。
-
foreach $row(@{$args->{search_ary}}){说你没有。或者,你忽略了你得到的错误,这同样糟糕。 -
@Ether 请阅读整篇文章并查看编辑行下方的信息和新功能。