Perl if语句从不正确,但理论上应该是

时间:2016-06-03 18:29:43

标签: perl if-statement

$ band1和$ band2两个被声明为(左边是$ band1,右边是$ band2)

s12 t12
s21 s11
t12 s12
t15 t23
t23 t15

在我得到第一个印刷声明之后

s   12  t   12
s   21  s   11
t   12  s   12
t   15  t   23
t   23  t   15

但好像我的第二个if语句永远不会被执行(因为它应该是第二次通过。虽然我不知道为什么它没有执行但它看起来是正确的,它应该第二次打印你好,第三次时间和第四次通过。真的应该打印你好任何时间段和两个都是t和乐队1的数字高于乐队2或乐队1和2都是s和乐队2的数字高于乐队1的,或如果乐队在左边是在,右边的乐队是s。

my @splitB1 = split(//, "$band1");
my @splitB2 = split(//, "$band2");
my $band1Num = join("","$splitB1[1]","$splitB1[2]");
my $band2Num = join("","$splitB2[1]","$splitB2[2]");
print $splitB1[0], "\t", $band1Num, "\t", $splitB2[0], "\t", $band2Num, "\n";
if (($band1Num < $band2Num and $splitB1[0]=="s" and $splitB2[0]=="s"){
       print "Hello World"
 }

感谢您

1 个答案:

答案 0 :(得分:5)

当前的问题是== is used for numeric equality and eq is used for string equality。这些是不同的操作,因此Perl具有单独的字符串和数字运算符。其他一些语言可以猜出==的含义,但Perl变量缺少类型,所以它不能。

警告(use warnings),您会收到警告。

s   11  t   12
Argument "s" isn't numeric in numeric eq (==) at /Users/schwern/tmp/test.plx line 13.
Argument "s" isn't numeric in numeric eq (==) at /Users/schwern/tmp/test.plx line 13.
Argument "s" isn't numeric in numeric eq (==) at /Users/schwern/tmp/test.plx line 13.
Argument "t" isn't numeric in numeric eq (==) at /Users/schwern/tmp/test.plx line 13.
Hello World

条件为真,因为当Perl尝试强制使用字母st或任何看起来不像数字的数字时,它会使用00 == 0所以$splitB1[0] == "s"是真的。

其他问题......

不引用单个变量 。它使得代码更难以阅读,并且在某些情况下使用重载对象(即,对象就像它们的字符串一样),它会过早地将对象转换为字符串,从而导致细微的错误。

join("",$splitB1[1],$splitB1[2]);      # Yes
join("","$splitB1[1]","$splitB1[2]");  # NO

使用正则表达式,而不是分割 。这不适合使用拆分。您的代码依赖于传入的字符串,只有一个字母和两个数字。使用正则表达式查找字母后跟数字,速度更快,代码更少,更健壮。

my($code1, $num1) = $band1 = /([a-z]+)(\d+)/i;

使用数组或哈希而不是$ var1和$ var2 。每当您发现自己编写$var1$var2时,请考虑使用数组。 $var[0]$var[1]。将它们作为一个组传递起来更容易,并且可以循环使用它们来保存重复的代码。

将所有内容放在一起,再加上一些其他功能,例如使用say并隔开复杂的条件......

use v5.10;
use strict;
use warnings;

my @bands = qw(s11 s12);

my @codes;
my @nums;

for my $idx (0..1) {
    ($codes[$idx], $nums[$idx]) = $bands[$idx] =~ /([a-z]+)(\d+)/i;
}

say $codes[0], "\t", $nums[0], "\t", $codes[1], "\t", $nums[1];

if (
    $nums[0] < $nums[1] and
    $codes[0] eq "s"    and
    $codes[1] eq "s"
) {
    say "Hello World"
}

这与您描述的逻辑不匹配,但代码已经存在该问题。我留下那个让你从这里弄清楚。 (提示:xor,排他性或者人类的意思和#34;或者#34;可能会有帮助。