2013-12-01 2 views
0

Я пытаюсь работать через то, что должно быть простым упражнением, и с этим я столкнулся с проблемой сравнения двух строк (один в массиве, а другой - как функция). В частности, линия:perl - сравнение двух строк, один параметр подпрограммы

if ($el eq $iName) 

не возвращается 1, даже если две строки равны.

Я поместил некоторые строки отладки над этой частью кода, чтобы увидеть, что является значением этого булева, и кажется, что это undef.

#!/usr/bin/perl -w 

use v5.14.0; 


sub greet { 
    #early example - no hashes, 

    #if first ever name print the name, 
    #if not first and not previously seen, print previous names, 
    #if same name as one previous, acknowledge this and print previous names 

    my $iName = $_[0]; 
    state @seen_names; 

    if ([email protected]_names) { 
     print "Hello $iName\n"; 
     push @seen_names, "$iName "; 
    } else { 
     my $push_name = 0; 
     foreach my $el (@seen_names) { 

#------------------------DEBUG----------- 
     print "equal? ", ("$el" eq "$iName"), "----\n"; #debug - the boolean looks undef 
     print "equal? ", ("$el" eq undef), "----\n"; #debug 
     print "equal? ", ("a" eq "a"), "----\n"; #debug 
#------------------------DEBUG----------- 

      if ($el eq $iName) { #debug - do not get into this if 
       #FIXME prints *all* names, including this one. 
       print "hello again $iName, all visitors so far: " , @seen_names, "\n"; 
      } else { 
       print "hello $iName, all visitors so far: @seen_names.\n"; 
       $push_name = 1; 
      } 
     } 
     if ($push_name) { 
      push @seen_names, "$iName "; 
     } 
    } 
} 

&greet ("Greg"); 
&greet ("Greg"); 
#&greet ("Bob"); 
#&greet ("James"); 
#&greet ("Jill"); 

Куда я иду не так?

+1

Я отредактировал ваш вопрос, чтобы исправить проблему ne/eq. Я удалю свой «ответ» сейчас :-) – vogomatix

+1

Почему вы нажимаете «$ iName» вместо простого $ iName? – sawyer

+0

Возможно, я неправильно истолковал ваш вопрос, но каждый раз, когда я вижу имя, которое еще не встречается, я добавляю его в массив @seen_names (после цикла), который сохраняет свое состояние между вызовами функций. Если имя уже было замечено, переменная $ push_name остается ложной, а входящее в нее имя снова не попадает в массив. – HexedAgain

ответ

1

Решение этой проблемы заключается в решении следующей ошибки, то есть, я заселение @seen_names через:

push @seen_names, "$iName "; 

все же $ iName в

if ($el eq $iName) 

не имеет места в этом; следовательно, if всегда будет терпеть неудачу.

Смежные вопросы