如果我在没有严格或警告的情况下使用它,此代码无需任何警告即可运行:
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 $atindex
和my $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);
除了不使用警告之外,有没有办法抑制警告?
答案 0 :(得分:1)
您的第二个解决方案可能与您想要的最接近。但是当你说my $atindex
时,它是当前块的本地 - 即你刚添加的if块。
所以你可能想说:
my ($atindex, $username);
if (@fields) {
$atindex = ...
$username = ...
}
答案 1 :(得分:0)
就个人而言,我只是这样做:
no warnings 'uninitialized';
...在尽可能小的范围内(即在while
循环内)。