我正在从之前发布的问题(here)开始工作,并试图将答案转换为子版本,以便多次使用它。不确定它是否正确。任何人都可以提供更好或更清洁的子?将代码转换为Perl子版,但不知道我是否正确
我有很多编程经验,但我的主要语言是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;使用警告;'在脚本/模块的顶部。它会捕获许多错误并使诊断程序更有用(当您的示例代码中已经修复了这些简单错误时,它们更有可能为SO上的人员提供帮助)。 – Ether 2010-06-13 17:13:43
@Ether ...此代码是来自较大脚本的复制粘贴。我在完整的脚本中使用严格和警告。 – 2010-06-13 17:30:18
'foreach $ row(@ {$ args - > {search_ary}}){'说你没有。或者,你忽略了你所得到的错误,这同样糟糕。 – Ether 2010-06-13 17:47:09