Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 为什么我的for循环是非法声明_Perl_For Loop - Fatal编程技术网

Perl 为什么我的for循环是非法声明

Perl 为什么我的for循环是非法声明,perl,for-loop,Perl,For Loop,我创建了两个sub,一个用来做斐波那契,另一个用来测试偶数。当我调用它时,虽然它说我的for循环在第7行中,次斐波那契是非法的,为什么 #!/usr/bin/perl use strict; use warnings; my ($x,$y); my $num = 0; sub Fibs($start,$stop){ for ($start..$stop){ ($x, $y) = ($y, $x+$y); my $total += $y;

我创建了两个sub,一个用来做斐波那契,另一个用来测试偶数。当我调用它时,虽然它说我的for循环在第7行中,次斐波那契是非法的,为什么

#!/usr/bin/perl
use strict;
use warnings;


my ($x,$y);
my $num = 0;

sub Fibs($start,$stop){
    for ($start..$stop){
        ($x, $y) = ($y, $x+$y);
            my $total += $y;
        }
    print "$total \n"
}

sub even($num){
    if ($num % 2 == 0){
        return $num;}
}

my $big_total = Fibs(even($num), 3999999)
根据以下建议编辑

很明显,我遗漏了一些东西。从反馈更新到新版本

#!/usr/bin/perl
use strict;
use warnings;


my ($x,$y);
my $num = 0;

sub Fibs{
    my ($start, $stop) = @_ ;
    for ($start..$stop){
        my ($x, $y) = (0,2);
            if ($x % 2 == 0){
                ($x, $y) = ($y, $x+$y);
                    my $total += $y;
        }
}

my $big_total = Fibs(0, 3999999)

除了缺少大括号外,Perl不支持子例程参数的这种声明

而不是

sub Fibs($start, $stop) {
    ...
}
你需要写一些东西,比如:

sub Fibs {
    my($start, $stop) = @_;
    ...
}
(Perl确实有原型,但它们并不真正用于声明参数类型,也不提供名称。有关讨论,请参阅。)

其他问题:

你应该加上

use strict;
use warnings;
您从不使用在外部范围中声明的
$x
$y


您的
偶数
功能似乎不完整。如果它的参数是奇数,它不会(显式)返回值。它的具体用途是什么?

它只能测试一个数字是否为偶数,如果为偶数则返回。@sayth:如果该数字为偶数,则只返回该数字。如果这个数字是奇数,它该怎么办?如果它是奇数,我也要它,不要用它。看来这个函数可能没用,所以就把它编译成fibs sub.@sayth:如果这个函数应该告诉你这个数字是否是偶数,那么如果是偶数它就需要返回一个真值,如果是奇数它就需要返回一个假值。例如:
次偶数{my($x)=@;;if($x%2==0){return 1;}否则{return 0;}
。(这可能更简洁,但我想强调一点,即在任何一种情况下都需要返回值。)感谢您花时间解释它。默认情况下,Perl像shell一样处理堆栈中的参数。如果您想要Algol风格的函数签名,您需要额外的软件:任何、、。正确地,而不是从其他人那里继承假设来蒙混过关。@daxim很抱歉学习。下次我会很出色的。现在你错过了一个
}
。如果你的缩进更加一致,这可能会更清楚。你对这个新项目有什么问题?如果您收到一条错误消息,您应该向我们显示确切的消息,而不仅仅是提示perl说它是非法的。如果我见过的话,这是一个火饵。有证据表明你实际上是在以一种结构化的方式学习,而不仅仅是在源代码工作之前对其进行重击。-我所看到的每一个Perl学习材料都教授如何从
@
中获取函数参数。实际上,我查阅了文献和视频课程。这里和。我犯过错误吗?是的。希望你们都是完美的,永远不要犯错误