为什么我们不能在for循环中使用“le”并且可以在“if condition”中使用

时间:2013-05-03 09:39:53

标签: perl

我作为初学者制作了这个节目。需要澄清一些事情! 为什么我无法在下面给出的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";
}

4 个答案:

答案 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属于字符串比较运算符,例如eqlege。这些运算符的描述为herecmp低于此值)。

对于在上面的例子中做我们期望的排序例程,我们必须使用数字比较运算符,这是&#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";