为什么单个字符的字符串相等测试不起作用?

时间:2009-06-24 09:28:49

标签: perl string comparison

如何比较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 个答案:

答案 0 :(得分:13)

您如何接受$category的价值?如果像my $category = <STDIN>那样完成,则必须在最后通过以下方式选择换行符:

chomp( my $category = <STDIN> );

答案 1 :(得分:2)

eq是正确的。据推测,$ category既不是“N”也不是“V”。

也许$ category中有意想不到的空白?

答案 2 :(得分:2)

***@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);

答案 3 :(得分:0)

eq 相比,效果很好。也许你应该在你的else块中输出 $ category 的值来看看它到底是什么?将输出括在引号中,以便查看是否存在任何周围的空格。

此外,如果您希望比较不区分大小写,请尝试:

if (uc($category) eq 'N') {

答案 4 :(得分:0)

如果我可以使用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 );
    }
  }
}