Почему мой тест на равенство строк для одного символа не работает? - PullRequest
4 голосов
/ 24 июня 2009

Как сравнить строки из одного символа в Perl? Прямо сейчас я пытаюсь использовать "eq":

print "Word: " . $_[0] . "\n";
print "N for noun, V for verb, and any other key if the word falls into neither category.\n";
$category = <STDIN>;

print "category is...." . $category . "\n";

if ($category eq "N")
{
    print "N\n";
    push (@nouns, $_[0]);
}
elsif($category eq "V")
{
    print "V\n";
    push (@verbs, $_[0]);
}
else
{
    print "Else\n";
    push(@wordsInBetween, $_[0]);
}

Но это не работает. Независимо от ввода, блок else всегда выполняется.

Ответы [ 5 ]

13 голосов
/ 24 июня 2009

Как вы принимаете значение $category? Если это будет сделано как my $category = <STDIN>, вам придется разбить символ новой строки в конце:

chomp( my $category = <STDIN> );
2 голосов
/ 24 июня 2009
***@S04:~$ perl -we '$foo = "f"; print "Success\n" if ($foo ne "e")'
Success
***@S04:~$ perl -we '$foo = "f"; print "Success\n" if ($foo eq "e")'
***@S04:~$

Вы пытались проверить, что на самом деле $category? Иногда эти вещи могут ускользнуть даже от лучших из нас ... Возможно, это строчные буквы или что-то совсем другое.

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

print "|>${category}<|";

Что еще примечательно, это Data :: Dumper :

use Data::Dumper;
print Dumper(\$category);
2 голосов
/ 24 июня 2009

EQ правильно. Предположительно, $ category не является ни "N", ни "V".

Может быть, в категории $ есть неожиданный пробел?

0 голосов
/ 24 июня 2009

Вот как бы я написал это, если бы мог использовать Perl 5.10.

#! perl
use strict;
use warnings;
use 5.010;
<Ч />
our( @nouns, @verbs, @wordsInBetween );
sub user_input{
  my( $word ) = @_;
  say "Word: $word";
  say "N for noun, V for verb, and any other key if the word falls into neither category.";
  $category = <STDIN>;
  chomp $category;

  say "category is.... $category";

  given( lc $category ){
    when("n"){
      say 'N';
      push( @nouns, $word );
    }
    when("v"){
      say 'V';
      push( @verbs, $word );
    }
    default{
      say 'Else';
      push( @wordsInBetween, $word );
    }
  }
}
0 голосов
/ 24 июня 2009

Сравнение с экв работает просто отлично. Может быть, вы должны вывести значение $ category в вашем блоке else, чтобы увидеть, что это такое? Заключите вывод в кавычки, чтобы увидеть, есть ли какие-либо окружающие пробелы.

Кроме того, если вы хотите, чтобы сравнения не учитывали регистр, попробуйте:

if (uc($category) eq 'N') {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...