我作为初学者制作了这个节目。需要澄清一些事情! 为什么我无法在下面给出的for循环中使用“le”,但我可以在“if condition”中使用它。这背后的原因是什么? ?
print "Type the number upto series should run\n";
my $var;
$var = int<STDIN>;
chomp $var;
my ($i, $t);
my $x = 0;
my $y = 1;
if($var eq 1) {
print "\nYour Series is : $x\n";
} elsif($var eq 2){
print "\nYour Series is : $x $y\n";
} elsif($var ge 2) {
print "Your Series is : $x $y ";
for($i = 1; $i le $var - 2; $i++) {
# Why the condition not working when I'm using "le"
# but it does work when I'm using "<="
$t = $x + $y;
$x = $y;
$y = $t;
print "$t ";
}
print "\n";
} else {
print "Error: Enter a valid postive integer\n";
}
答案 0 :(得分:3)
您可以随意使用le
和<=
。但是你应该知道他们完全不同的运营商。
数字比较运算符
== != < <= > >= <=>
等效字符串比较运算符
eq ne lt le gt ge cmp
根据需要将字符串和数字相互转换。这意味着例如
3 ge 20 # true: 3 is string-greater than 20
11 le 2 # true: 11 is string-less-or-equal than 2
因为词典排序按字符比较。因此,当您希望将$variables
的内容视为数字时,请使用数字运算符,这样会产生正确的结果。
请注意,Perl会在字符串和数字之间进行无形转换。建议use warnings
,以便在字符串无法表示数字时(例如"a"
)收到有用的消息。
答案 1 :(得分:2)
已给出正确答案,ge
进行字符串比较,例如11
被视为小于2
。解决方案是使用数字比较==
和>=
。
我想我会帮助证明你遇到的问题。考虑一下默认sort
如何工作的演示:
$ perl -le 'print for sort 1 .. 10'
1
10
2
3
4
5
6
7
8
9
如您所见,它认为10
低于2
,这是因为字符串比较,这是sort
的默认模式。这就是默认排序例程的内幕:
sort { $a cmp $b }
cmp
属于字符串比较运算符,例如eq
,le
和ge
。这些运算符的描述为here(cmp
低于此值)。
对于在上面的例子中做我们期望的排序例程,我们必须使用数字比较运算符,这是&#34;太空飞船运营商&#34; <=>
:
sort { $a <=> $b }
在你的情况下,你可以尝试使用这个单行代码解决问题:
$ perl -nlwe 'print $_ ge 2 ? "Greater or equal" : "Lesser"'
1
Lesser
2
Greater or equal
3
Greater or equal
11
Lesser
答案 2 :(得分:1)
当您将数字与eq,le,gt .....等进行比较时;他们首先被转换为字符串。字符串将按字母顺序检查,因此“11”将小于“2”。
所以你在比较数字时应该使用==,&lt; =,&gt; = ...等。
答案 3 :(得分:1)
我认为您可能希望看到更像Perl的程序,它可以像您那样生成Fibonnaci系列。
use strict;
use warnings;
print "Type the length of the series\n";
chomp(my $length = <>);
unless ($length and $length !~ /\D/ and $length > 0) {
print "Error: Enter a positive integer\n";
}
print "\n";
my @series = (0, 1);
while (@series < $length) {
push @series, $series[-2] + $series[-1];
}
print "@series[0..$length-1]\n";