2015-08-31 12 views
-3

有時會運行代碼,有時會給linux主機帶來錯誤。 需要檢查爲什麼不打印, 錯誤,消息:在./fa_list.pl線139未初始化值的使用中的sprintf,行Perl腳本提供錯誤uninialized varilable訪問

可有人檢查,爲什麼我收到錯誤?

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

在你的代碼中有如下評論:'#<===這是第139行'可能是一種禮貌,可以讓你的問題更加美味一點.... – tjd

+0

這是所有的代碼,當我複製並且過去這條線139是最後一行,並且是關閉文件句柄的一個調用,並且與sprintf無關 –

+0

哪一行是139? – chilemagic

回答

0

我相信是有問題lc($FAH{$fa})。 你有沒有檢查過你在你的代碼中初始化$FAH