Perl Script提供了错误的uninialized varilable访问

时间:2015-08-31 20:13:31

标签: perl

有时运行代码,有时会在linux主机上出错。 需要检查为什么没有打印, 错误,消息:在./fa_list.pl第139行,行

中的sprintf中使用未初始化的值

有人可以检查,为什么我会收到错误?

use Getopt::Long;
my $sid = '9999';
my $Fa_VSan_Map = 'Fa_VSan_Map';
sub usage {
   my $message = $_[0];
   if (defined $message && length $message) {
      $message .= "\n"
         unless $message =~ /\n$/;
   }
   my $command = $0;
   $command =~ s#^.*/##;
   print STDERR (
      $message,
      "usage: $command -sid xxx -outf FA_Mapping\n" .
      "Where -sid: is primary SID to show mappings.\n" .
      "      -outf: Output File prefix.\n" .
      "      -Reserved...\n"
   );

   die("\n")
}

GetOptions( 'sid=i' => \$sid, 'outf=s' => \$Fa_VSan_Map) or
    usage("Invalid commmand line options.");

print($sid);

my $outf = "$Fa_VSan_Map$sid.csv";
my $outf1 = "Fa_VSan_Map1$sid.csv";
my ($mydir,$dir_port,$dir_port_wwpn,$FaWWPN);
my (%FA,%FAH,%FAC,%VSAN);
my ($wwpn,$host,$port,$fcid,$logged,$fab);

# 50:00:09:72:08:4b:05:89, => cdc02-core1-1.yyyyy.xxxx.com,CISCO,fc3/12,VS251,50:00:09:72:08:4b:05:89,,8,Active
# cdc02-core-1-2.yyyyy.xxxx.com,CISCO,fc1/29,VS251,50:00:09:73:00:1c:e1:1c,,8,Active

sub LoadVSAN()
{       
    my $vsanf = "VSAN$sid.csv";
    print ($vsanf);
    open (VSAN, "<", $vsanf) or die "Could not open $!";
    while (<VSAN>) {
      if (/Active/) {
        my @array = split /,/;
        print (@array);
        my $key = $array[4];  
        $key =~ s/://g;
        my @line_arranged = ($array[3],$array[2],$array[0],$array[6],$array[7]);
        $VSAN{$key} = \@line_arranged;
        print($key, ": ", @{$VSAN{$key}}, "\n");
        }
    }
    close VSAN;
}
LoadVSAN;
# foreach my $key (%VSAN) {
    # print(${VSAN{$key}}[0]); print("\n");
    # ${$VSAN{$FaWwpn}}[0]
# }
open (OUT, ">", $outf) or die "Could not open $outf $!";
open( OUT1, ">",$outf1) or die "Could not open $outf1 $!";
my $sidtxt = "sidcfg.fa$sid.txt";
my $cmd = 'symcfg -sid ' . $sid . ' list -fa all -v  >  ' . $sidtxt;
system($cmd); 
open ( SYM, "<" ,  $sidtxt ) or die "Could not open $sidtxt $!";

while ( <SYM>) {
    chomp ;
    if (/Director Identification:/) {
        $mydir = $_;
        $mydir =~ s/\s+Director Identification: //;
        $mydir =~ s/FA-//;
    }
    elsif (/Director Port:/) {
        $port = $_;
        $port =~ s/\s+Director Port: //;
        $dir_port = sprintf '%04d_%03s_%03d', int($sid), $mydir, int($port);
    } 
    elsif (/WWN Port Name/) {
        $wwpn = $_;
        $wwpn =~ s/\s+WWN Port Name\s+: //;
        $dir_port_wwpn = sprintf '%s,%s', $dir_port, $wwpn; 
        $FA{$dir_port} = $wwpn;
    }
}
close(SYM);

$sidtxt =  'symaccess.ll.' . $sid .  '.txt';
$cmd = 'symaccess -sid ' . $sid . ' list logins > ' . $sidtxt;
#print($cmd);
system($cmd );

open ( SYM, "<" ,  $sidtxt )  or die "Could not open $sidtxt $!";

while ( <SYM>) {
    chomp ;
    if (/Director Identification/) {
        $mydir = $_;
        $mydir =~ s/Director Identification\s+:\s+//;
        $mydir =~ s/FA-//;
    }
    elsif (/Director Port/) {
        $port = $_;
        $port =~ s/Director Port\s+:\s+//;
        $dir_port = sprintf '%04d_%03s_%03d', int($sid),$mydir, int($port);
    }
    elsif (/Fibre/) {
        ($wwpn,undef, $host,$port,$fcid,$logged,$fab) = split; 
        my $host_port;
        if( lc($host) eq 'null') {
            $host_port = substr($wwpn,10,6);
        }
        else {
            $host_port = $host . '_' . $port . '_' . substr($wwpn,12,4);
        }
        if (exists $FAH{$dir_port}) {
            $FAH{$dir_port} .=  ':' . $host_port;
            $FAC{$dir_port} += 1;
        } else {
            $FAH{$dir_port} =  $host_port;
            $FAC{$dir_port} = 1;
        }
        if ( $logged eq  "Yes") {
            my $line = sprintf ( '%s,%s,%s,%s', $dir_port, $FA{$dir_port}, $host_port, $fcid);
            print (OUT1 $line . "\n");
        }
    }
}
print OUT "Fa,FaWWPN,VSan,HostCount,PERCENT_BUSY,HostNames\n";
my $PERCENT_BUSY=10.0;
foreach my $fa ( keys %FAC) {
    my $formula = '=VLOOKUP(B2,Sheet1!A$2:F$600,6,FALSE)';
    my $FaWwpn = lc($FA{$fa});
    #print($FaWwpn . ": " . $VSAN{$FaWwpn}->[0] . "\n" );
##下面是第139行
    my $line = sprintf ('%s,%s,%s,%s,%3.2f,%s', $fa, $FaWwpn, ${$VSAN{$FaWwpn}}[0], $FAC{$fa}, $PERCENT_BUSY, lc($FAH{$fa}));
    print OUT $line . "\n";
    #print $line . "\n";
}
close(SYM);

1 个答案:

答案 0 :(得分:0)

我认为lc($FAH{$fa})存在问题。 你检查过你在代码中初始化了$FAH吗?