Perl If Elsif Else总是转到Else

Perl If Elsif Else总是转到Else,perl,if-statement,Perl,If Statement,我在一个更大的程序中有一段代码,假设它取一个字母(a…D)并将其转换成一个数字(0…3)。由于某种原因,它总是跳到另一个。代码如下: my $AA = shift @filearray; chomp($Q); chomp($A1); chomp($A2); chomp($A3); chomp($A4); chomp($AA); print "1:$AA\n";

我在一个更大的程序中有一段代码,假设它取一个字母(a…D)并将其转换成一个数字(0…3)。由于某种原因,它总是跳到另一个。代码如下:

        my $AA = shift @filearray;

        chomp($Q);
        chomp($A1);
        chomp($A2);
        chomp($A3);
        chomp($A4);
        chomp($AA);
        print "1:$AA\n";

    #convert answer to number

    my $AB = 0;
        if ($AA eq "A")
        {
            $AB = 0;
        }

        elsif ($AA eq "B")
        {
            $AB = 1;
        }

        elsif ($AA eq "C")
        {
            $AB = 2;
        }

        else {
            $AB = 3;
        }
        print "2:$AB\n\n";
输出符合以下几点:

    1:B
    2:3

    1:A
    2:3

    1:D
    2:3

    1:C
    2:3

    1:D
    2:3

    1:B
    2:3

    1:B
    2:3

    1:A
    2:3

    1:D
    2:3

现在我意识到我可以从Ascii值中减去65,但我仍然想知道……发生了什么事?

可能
$AA
包含一个不可见的字符(空格、回车)。验证
$AA
是否包含您认为它的功能:单个字符。检查此问题的一种方法:

length($AA) == 1
更高级、信息更丰富的检查包括:

use Data::Dumper;
local $Data::Dumper::Useqq = 1;
print Dumper($AA);


最后一项检查显示
$AA

中每个字符的序数值,可能
$AA
包含不可见字符(空格、回车)。验证
$AA
是否包含您认为它的功能:单个字符。检查此问题的一种方法:

length($AA) == 1
更高级、信息更丰富的检查包括:

use Data::Dumper;
local $Data::Dumper::Useqq = 1;
print Dumper($AA);


最后一项检查显示
$AA

中每个字符的序号值,确保末尾没有空格。将打印更改为
print“1:$AA:”
并查看是否在B和冒号之间打印任何内容。@Raymond我喜欢这个主意,但当我这样做时,我得到::B 2:3也不会删除任何空格?不,最多
chomp
删除一个“行尾”序列(通常是
\n
\n\r
\r
中的一种,具体取决于您的操作系统)。常见的问题是获取在Windows上创建的文件(行尾
\r\n
)并在Unix中处理(行尾
\n
).Linux中的
chomp
将只删除
\n
,在每行末尾留下一个
\r
。@Mob在研究了如何使用正则表达式删除EOL字符后,我发现行=~s/[\r\n]+$/;感谢您的帮助。请确保末尾没有任何空格。将打印更改为
print“1:$AA:”
并查看是否有任何东西在B和冒号之间打印。@RaymondChen我喜欢这个想法,但当我这样做时,我得到::B 2:3也不会删除任何空格?不,最多
chomp
删除一个“行尾”序列(通常是
\n
\n\r
\r
中的一个,取决于您的操作系统)。一个常见问题是获取在Windows上创建的文件(行尾
\r\n
)并在Unix中处理它(行尾
\n
).A
chomp
在Linux中只会删除
\n
,在每一行的末尾留下一个
\r
。@Mob在研究了如何使用regex删除EOL字符后,我发现行=~s/[\r\n]+$/;谢谢你的帮助。看起来确实有隐藏的字符。当我运行你提供的内容时,我得到了1:B$VAR1=“B\r”;66 13 42.0D\n 2:3.不应该从空白处删除\r吗?@traisjames:不一定。请参阅我上面的评论。看起来确实有隐藏字符。当我运行您提供的内容时,我得到1:B$VAR1=“B\r”;66 13 42.0D\n 2:3.不应该从空白处删除\r吗?@traisjames:不一定。请参阅我上面的评论。