因此,在构建关于字符串匹配(this thread)的问题时,我正在努力将解决方案3中的信息实现为我正在处理的问题的工作解决方案。
然而,我遇到了错误,特别是关于以下功能的这一行:
next if @$args->{search_in} !~ /@$cur[1]/;
syntax error at ./db_index.pl line 16, near "next "
作为一个perl新手我的问题是我在这里做错了什么?
sub search_for_key
{
my ($args) = @_;
foreach $row(@{$args->{search_ary}}){
print "@$row[0] : @$row[1]\n";
}
my $thiskey = NULL;
foreach $cur (@{$args->{search_ary}}){
print "\n" . @$cur[1] . "\n"
next if @$args->{search_in} !~ /@$cur[1]/;
$thiskey = @$cur[0];
last;
}
return $thiskey;
}
答案 0 :(得分:6)
你在前一行的末尾留下了分号。无论如何,这就是造成语法错误的原因。我认为你也在滥用$args
,但在不知道你如何调用这个函数的情况下很难确定。
答案 1 :(得分:2)
这里有几个问题。
在您执行其他操作之前,您是否在脚本顶部添加了use strict;
和use warnings;
?您只发布了sub,但很明显您没有使用它们。
什么是NULL
? (严格不会让你使用裸言语......)请务必阅读What is Truth in Perl? Perly
处理“真相”或“假”的方式越defined
/ { {1}}或undef
或专门测试作为惯例选择的值。
在exists
;
您的数据结构似乎过于复杂。据我所知,你传递的数组哈希引用,是吗?为什么您的数据结构变得模糊,备份并查看您要执行的操作...
Perl为您提供了很多shoot yourself in the foot的方法。它不是严格打字的,您可以通过将引用命名为它们所引用的衍生物来为自己(以及您的读者)提供帮助。因此,不要使用print "\n" . @$cur[1] . "\n"
代替$args
。
答案 2 :(得分:1)
旁注,你确定你不能只使用哈希来做你正在做的事情吗?做一些如此简单的事情似乎非常复杂:
my %hash = (
key1 => 'value1',
key2 => 'value2',
);
exists $hash{$search_in}; # true/false.
my $result = $hash{$search_in}; # returns 'value1' when $search_in is 'key1'
或者如果您需要按值搜索:
my %flip = reverse %hash;
$result = $flip{$search_in};
如果真的需要正则表达式键(或值)查找:
sub string_match {
my ($lookup_hash, $key ) = @_;
for my $hash_key ( %{ $lookup_hash } ){
return $hash_key if $key =~ $lookup_hash->{$hash_key};
}
return; # not found.
}
my $k = string_match({
'whitespace at end' => qr/\s+$/,
'whitespace at start' => qr/^\s+/,
}, "Some Garbage string "); # k == whitespace at end