避免未初始化警告 - Perl范围

时间:2014-01-01 05:08:13

标签: perl scope

如果我在没有严格或警告的情况下使用它,此代码无需任何警告即可运行:

while (<>) {

        $_ =~ s/^\s+//;
        $_ =~ s/ +\d$/ /g;
        my @fields = split(/\s{2,}/);
        my $atindex = rindex($fields[0],"@",);
        my $username = substr($fields[0],0,$atindex);

        if (length($fields[1]) == 0 || $fields[0] eq 'holder') {
        } elsif (!$fields[2]) {
            print "grant $fields[1] to user '$username';\n";
        } elsif (!$fields[3]) {
            print "grant ", ($fields[2] eq 'any') ? 'execute any' : $fields[2]," on application '$fields[1]' to user '$username';\n";
        } else {
            print "grant ", ($fields[3] eq 'any') ? 'execute any' : $fields[3]," on database '$fields[1]'.'$fields[2]' to user '$username'\n";
        } 
    };

但是,如果我使用严格和警告,我会在以$fields[0]fields[1]开头的行中收到有关my $atindexmy $username的未初始化值的错误if statement。

所以我尝试使用这段代码限制使用这些值:

if (@fields) {
my $atindex = rindex($fields[0],"@",);
my $username = substr($fields[0],0,$atindex);
}

但是我在if语句中以$username为特色的行中得到了错误:

Global symbol "$username" requires explicit package name at

所以我尝试使用包名而不是if(@fields)这样的块,但后来我得到了原始的未初始化警告:

package user;
use strict;
use warnings;

my $atindex = rindex($fields[0],"@",);
my $username = substr($fields[0],0,$atindex);

除了使用警告之外,有没有办法抑制警告?

2 个答案:

答案 0 :(得分:1)

您的第二个解决方案可能与您想要的最接近。但是当你说my $atindex时,它是当前块的本地 - 即你刚添加的if块。

所以你可能想说:

my ($atindex, $username);

if (@fields) {
    $atindex = ...
    $username = ...
}

答案 1 :(得分:0)

就个人而言,我只是这样做:

no warnings 'uninitialized';

...在尽可能小的范围内(即在while循环内)。