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)
谢谢
直接问题是==用于数字相等,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的试图迫使字母的条件为真s或t或任何看起来不像一个数字是一个数字,它使用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,排他性或者,或者人类的意思是"或",可能在这里有所帮助).
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |