Perl抛出有关语法的错误消息

时间:2010-06-13 02:04:52

标签: perl arrays syntax

因此,在构建关于字符串匹配(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;    
}

3 个答案:

答案 0 :(得分:6)

你在前一行的末尾留下了分号。无论如何,这就是造成语法错误的原因。我认为你也在滥用$args,但在不知道你如何调用这个函数的情况下很难确定。

答案 1 :(得分:2)

这里有几个问题。

  1. 在您执行其他操作之前,您是否在脚本顶部添加了use strict;use warnings;?您只发布了sub,但很明显您没有使用它们。

  2. 什么是NULL? (严格不会让你使用裸言语......)请务必阅读What is Truth in Perl? Perly处理“真相”或“假”的方式越defined / { {1}}或undef或专门测试作为惯例选择的值。

  3. exists

  4. 之后遗失;
  5. 您的数据结构似乎过于复杂。据我所知,你传递的数组哈希引用,是吗?为什么您的数据结构变得模糊,备份并查看您要执行的操作...

  6. 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