1

我作为初学者制作了这个程序。需要澄清一些事情!为什么我不能在下面给出的 for 循环中使用“le”,但我可以在“if 条件”中使用它。这背后的原因是什么。?

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";
}
4

4 回答 4

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")得到有用的消息。

于 2013-05-03T09:49:48.093 回答
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属于字符串比较运算符,如eqlege。这些运算符在此处进行了描述(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
于 2013-05-03T10:17:07.747 回答
1

当您将数字与 eq、le、gt..... 等进行比较时;它们首先被转换为字符串。并且将检查字符串的字母顺序,因此此处的“11”将小于“2”。

所以你应该在比较数字时使用 ==,<=,>= ...等。

于 2013-05-03T09:50:00.663 回答
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";
于 2013-05-03T11:03:53.737 回答