我作为初学者制作了这个程序。需要澄清一些事情!为什么我不能在下面给出的for循环中使用"le",但我可以在"if条件"中使用它。这背后的原因是什么?
?print "Type the number upto series should runn";
my $var;
$var = int<STDIN>;
chomp $var;
my ($i, $t);
my $x = 0;
my $y = 1;
if($var eq 1) {
print "nYour Series is : $xn";
} elsif($var eq 2){
print "nYour Series is : $x $yn";
} 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 integern";
}
您可以随意使用 数值比较操作符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"
)时得到有用的消息。
正确答案已经给出,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
一样,属于字符串比较操作符。这些操作符在这里描述(cmp
在它下面)。
要使排序例程达到我们在上面示例中期望的效果,我们必须使用一个数值比较运算符,即"宇宙飞船运算符"<=>
:
sort { $a <=> $b }
在您的情况下,您可以使用下面的一行代码来解决问题:
$ perl -nlwe 'print $_ ge 2 ? "Greater or equal" : "Lesser"'
1
Lesser
2
Greater or equal
3
Greater or equal
11
Lesser
当你用eq, le, gt.....比较数字时等;它们首先被转换为字符串。字符串将根据字母顺序进行检查,因此这里的"11"将小于"2"。
所以你应该使用==,<=,>=…
我认为您可能希望看到一个更像perl的程序,它可以生成像您的那样的Fibonnaci系列。
use strict;
use warnings;
print "Type the length of the seriesn";
chomp(my $length = <>);
unless ($length and $length !~ /D/ and $length > 0) {
print "Error: Enter a positive integern";
}
print "n";
my @series = (0, 1);
while (@series < $length) {
push @series, $series[-2] + $series[-1];
}
print "@series[0..$length-1]n";