Сравнение двух регулярных выражений с ошибкой If-Statement - PullRequest
4 голосов
/ 13 октября 2011

Я хочу сравнить два регулярных выражения в Perl, но это не удается:

Использование неинициализированного значения в числовом выражении <==> в [... datafile & row]. Аргумент [другое регулярное выражение!] Не является числовым в числовом выражении <==> [...]

Я хочу сохранить регулярное выражение в массиве, когда значение еще не существует. Поэтому я сравниваю текущее регулярное выражение (tmpvar) со всеми элементами в массиве.

Возможно ли это вообще или мне нужно использовать обходной путь?

$pass = new String::Random;
my $array_counter=0;

my @regex_array = ();

push(@regex_array, $pass->randregex($regex_from_file));

#print "@regex_array";
$array_counter++;

while ($array_counter != $anzahl_regex)
{

    print $array_counter;
    my $tmpvar = $pass->randregex($regex_from_file);
    my $tmpcheck = 0;
    my $tmparraylength = scalar (@regex_array);

    for ($i=0; $i<= $tmparraylength ;$i++)
    {

        if ($tmpvar == $regex_array[$i]) # ERROR
        {
            $tmpcheck =1;
        }
    }



    if ($tmpcheck == 0) # es wurde kein duplikat gefunden
    {
        push(@regex_array,$tmpvar);
        $arraycounter++;
    }

    $arraycounter++;

}

Ответы [ 3 ]

6 голосов
/ 13 октября 2011

== используется для сравнения чисел. Используйте eq для сравнения строк:

if ($tmpvar eq $regex_array[$i]) 

Кроме того, вы выходите за пределы regex_array в цикле for:

for ($i=0; $i < $tmparraylength ;$i++)
              ^ this must not be <=

Наконец, вы делаете слишком много работы. Используйте хеш, он автоматически «удаляет дубликаты ключей».

my %temp_hash;
while (scalar(keys %temp_hash) < number_of_things_you_want) {
  $temp_hash{$pass->randregex($regex_from_file)}++;
}
@regex_array = keys %temp_hash;
2 голосов
/ 13 октября 2011

Не используйте числовое сравнение == используйте сравнение строк eq.

См. Здесь документацию по perldoc.perl.org

0 голосов
/ 13 октября 2011

Если все, что вы хотите сделать, это сбросить массив, это может быть более подходящим:

{
    my %h;
    map { $h{$_} = 1 } @all_regex;
    @all_regex = keys %h;
}

Имейте в виду, что он не сохраняет порядок исходного массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...