Perl выдает сообщение об ошибке синтаксиса - PullRequest
0 голосов
/ 13 июня 2010

Итак, выстраивая вопрос о сопоставлении строк ( этот поток ), я работаю над внедрением этой информации в решении 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 ]

6 голосов
/ 13 июня 2010

Вы оставили точку с запятой в конце предыдущей строки. В любом случае это и стало причиной синтаксической ошибки. Я думаю, вы также неправильно используете $args, но в этом трудно быть уверенным, не зная, как вы вызываете эту функцию.

2 голосов
/ 13 июня 2010

Здесь есть несколько проблем.

  1. Вы добавляете use strict; и use warnings; вверху вашего скрипта, прежде чем делать что-то еще? Вы только опубликовали саб, но ясно, что вы их не используете.

  2. Что такое NULL? (строгий не позволит вам использовать голые слова ...) Обязательно прочитайте Что такое Истина в Perl? Более Perly способ состоит в том, чтобы иметь дело с «правдой» или «ложью» - defined / undef или exists или специально для проверки значения, выбранного в качестве соглашения.

  3. Отсутствует ; после print "\n" . @$cur[1] . "\n"

  4. Ваши структуры данных кажутся слишком сложными. Из того, что я могу сказать, вы передаете ссылку на хэш массивов, верно? Почему ваши структуры данных становятся действительно неясными, сделайте резервную копию и посмотрите, что вы пытаетесь сделать ...

  5. Perl дает вам множество способов выстрелить себе в ногу . Он не является строго типизированным, и вы сделаете себе (и своим читателям) услугу, назвав ссылки как производные от того, на что они ссылаются. Поэтому вместо $args используйте $ref2HoArefs, например.

1 голос
/ 13 июня 2010

Примечание: вы уверены, что не можете просто использовать хеш для того, что делаете? Это кажется ужасно сложным, сделать что-то так просто:

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...