$ 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"
}
感谢您
答案 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尝试强制使用字母s
或t
或任何看起来不像数字的数字时,它会使用0
。 0 == 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;可能会有帮助。