Perl子例程无法循环工作

时间:2018-08-09 05:36:09

标签: perl loops subroutine

在Perl中,我尝试编写一个简单的代码来查找数字是否可以表示为素数之和。示例代码如下所示:

sub funcIsPrime {
    my $num = $_[0];    
    my $isPrime = 1;
    for($i= 2; $i <= $num/2; $i++){
        if($num%$i == 0){
            $isPrime = 0;
            last;
        }
    }
    return $isPrime;
}

#my $num = <>;
my $num = 20;
for($i = 2; $i <= $num/2; $i++){
    print "$i\t";
    my $j = $num-$i;
    print "$j\n";

    if(funcIsPrime($i) and funcIsPrime($j)){    # Line x
        print "$num = $i + $j\n";
    }
}

第x行中的函数调用语句不执行。将同一行放在循环外部时效果很好。有什么可能的解决方案?请帮忙。谢谢。

1 个答案:

答案 0 :(得分:1)

主要问题是变量声明中缺少my。如果包含use warnings;use strict;,Perl将不允许您运行该程序:

Global symbol "$i" requires explicit package name (did you forget to declare "my $i"?) at test.pl line 22.
Execution of test.pl aborted due to compilation errors.

这是简化的工作代码(顺便说一下,您可以搜索直到n的平方根的因子,尽管无论如何这都不是完美或有效的素数测试):

use strict;
use warnings;

sub isPrime {
    my $num = $_[0];    

    for (my $i = int sqrt $num; $i > 1; $i--) {
        if ($num % $i == 0) {
            return 0;
        }
    }

    return 1;
}

my $num = 20;

for (my $i = 2; $i <= $num / 2; $i++) {
    my $j = $num - $i;

    if (isPrime($i) && isPrime($j)) {
        print "$num = $i + $j\n";
    }
}

输出

20 = 3 + 17
20 = 7 + 13