【问题标题】:Perl throws an error message about syntaxPerl 抛出有关语法的错误消息
【发布时间】:2010-06-13 02:04:51
【问题描述】:

因此,基于关于字符串匹配的问题 (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;    
}

【问题讨论】:

  • 作为新手,您应该拥有use strictuse warnings ...并且可能正在从一本足以解释它们的用途以及它们为何如此重要的书中学习 Perl。

标签: perl arrays syntax


【解决方案1】:

您在上一行的末尾省略了分号。无论如何,这就是导致语法错误的原因。我认为您也滥用了$args,但如果不知道您是如何调用此函数的,就很难确定这一点。

【讨论】:

  • 愚蠢的错误万岁。谢谢。没看到那个。
【解决方案2】:

这里有几个问题。

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

  2. 什么是NULL? (严格不会让你用空话...)一定要看What is Truth in Perl?Perly处理“真”或“假”的方法是defined/undefexists或专门测试选择作为约定的值。

  3. print "\n" . @$cur[1] . "\n" 之后缺少;

  4. 您的数据结构似乎太复杂了。据我所知,您正在传递对数组哈希的引用,对吗?为什么你的数据结构变得非常模糊,备份并看看你正在尝试做什么......

  5. Perl 为您提供了很多方法来shoot yourself in the foot。它不是严格键入的,您将通过将引用命名为它们所指内容的派生来帮自己(和您的读者)一个忙。所以不要使用$args,例如使用$ref2HoArefs

【讨论】:

  • @Kent:Windows 1.0 - 3.0 在工程上错过了什么,Charles Simonyi 在态度上弥补了!当然,当我们坐在这里使用他的命名约定时,他必须乘坐私人俄罗斯火箭进入太空!
  • 我同意,5. 中提出的符号很糟糕。变量应该以它的作用(目的)命名,而不是它包含的数据类型。随意检查(倾倒)将揭示复杂类型的数据结构,而简单类型已经可以从它们的印记中识别出来。但是,您不能从倾销中获得意图或目的;这是程序员的责任。所以$args其实是比$ref…更好的选择。
  • @daxim:我更喜欢知道引用的意图而不是使用的意图。如果没有注释或命名约定,就不可能知道预期的参考是什么以及印记是否真的正确。这里的使用意图比参考更清楚。如果你看perldoc.perl.org/perlreftut.html,这也是建议的格式……
  • The author of perlreftut 写道:»perlreftut 手册并未“建议”变量名称对变量的类型进行编码。该文档对变量命名的所有问题完全没有提及,因为它的目的是提供 Perl 参考语法的介绍,而不是就变量命名问题提供建议。引用它作为正确变量命名问题的权威与引用它作为正确缩进样式或任何其他样式问题的权威一样徒劳。«
【解决方案3】:

旁注,你确定你不能只使用哈希来做你正在做的事情吗?做这么简单的事情似乎非常复杂:

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 

【讨论】:

  • 此数组来自数据库选择 (dbi: $ref = $sth->fetchall_arrayref;)。我还能将其用作哈希吗?
  • @Ben , my (%hash) = map { @{ $_ } } @{ $sth->fetchall_arrayref } # 我想是的。但它可能效率较低,具体取决于您对数据进行的查找次数。明智的做法是修改您的语句搜索以返回正确的数据 =)。
猜你喜欢
  • 1970-01-01
  • 2015-07-13
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
相关资源
最近更新 更多