Perl如果语句永远不正确,但理论上应该是

Sam*_*Sam -1 perl if-statement

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

s12 t12
s21 s11
t12 s12
t15 t23
t23 t15
Run Code Online (Sandbox Code Playgroud)

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

s   12  t   12
s   21  s   11
t   12  s   12
t   15  t   23
t   23  t   15
Run Code Online (Sandbox Code Playgroud)

但似乎我的第二个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"
 }
Run Code Online (Sandbox Code Playgroud)

谢谢

Sch*_*ern 5

直接问题是==用于数字相等,eq用于字符串相等.这些是不同的操作,因此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
Run Code Online (Sandbox Code Playgroud)

因为当Perl的试图迫使字母的条件为真st或任何看起来不像一个数字是一个数字,它使用0.0 == 0$splitB1[0] == "s"是真的.


其他问题...

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

join("",$splitB1[1],$splitB1[2]);      # Yes
join("","$splitB1[1]","$splitB1[2]");  # NO
Run Code Online (Sandbox Code Playgroud)

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

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

使用数组或哈希而不是$ 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"
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我找到了你最明显问题的答案.我还发布了一些没有立即明显的额外清理的解释.这是奖金; 即使你现在不理解它,它也指向你接下来可能学到的东西.编码不仅仅是获得所需的输出,而Stack Overflow也不是"修复我的免费代码"服务.如果您对答案有疑问,请询问他们. (2认同)
  • @ C.Monster"*我不需要知道任何这些东西*"...询问专家的一部分是专家知道你不知道你不知道的事情(不是拼写错误)和可以看到你做不到的事情.而且,它再次明确地与答案的主要部分(说明主要错误)分开,所以如果你愿意,你可以忽略它.现在,您可以谈谈您仍然遇到的问题,我可以尝试提供帮助.或者你可以再次抱怨你的免费专家代码审查,如果这对你来说很糟糕,我会删除答案. (2认同)