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



如果我在没有严格或警告的情况下使用它,则此代码可以在没有任何警告的情况下工作:

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";
        } 
    };

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

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

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);

那么除了不使用警告之外,有没有办法抑制该警告呢?

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

所以你可能想说:

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

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

no warnings 'uninitialized';

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

最新更新