for循环在比较后没有递增

时间:2014-01-26 10:03:52

标签: perl

#!/usr/bin/perl -w                                                                                   
@success = qw(client1 client2 client3 client9);                                                      
print "the success array is @success\n";

@arr = qw(client3 client9);    
$asize = scalar(@arr);
$absize = scalar(@success);
@using  = qw(client2);

print "\n @using \n";
$usize = @using;

print "\n $asize $absize \n";

for ( $i = 0 ; $i < $asize ; $i++ ) {
    for ( $j = 0 ; $j < $absize ; $j++ ) {
        if ( $arr[$i] eq $success[$j] ) {
            print " \n $i $j ";
            print " before  $arr[$i] our choice\n";
            check( $arr[$i] );
            print "after check our choice \n";
        }
    }
}    ###end of t

sub check {
    print "################ checking client status $_[0] ###################### ";
    print "inside function call \n\n\n";

    our $sc = $_[0];

    for ( $j = 0 ; $j < $usize ; $j++ ) {
        if ( $sc eq $using[$j] ) {
            print "$sc is in use pls dont use \n";

            ###should we move to some file";
        }
        else {
            if ( $j eq $usize - 1 ) {
                print " reboot client\n";
                print "before reboot\n";
            }
        }
    }
}

我试图检查“arr”数组的内容是否在“success”数组中,如果它是真的我正在检查该元素是否存在于“using”数组中。但是如果输入客户端是“arr”数组中的client3和client9,那么它将进行无限循环。

提前谢谢

1 个答案:

答案 0 :(得分:10)

问题在于:您正在使用全局变量。 $jsub check的主循环AND中使用,导致混乱。

快速解决方法是将for-loops中的一个更改为使用my

# in sub check:
for ( my $j = 0 ; $j < $usize ; $j++ ) {

正确的做法是:

始终use strictuse warnings并在脚本中的所有变量声明之前使用my

#!/usr/bin/perl
use strict;
use warnings;
my @success = qw(client1 client2 client3 client9);
...
for ( my $i = 0 ; $i < $asize ; $i++ ) {
...

这是discussed before here on SO。另请阅读perlintro on variable scoping(实际阅读整个页面)