我目前正在開發一個監視軟件,它接收服務器名稱和IP地址的輸入文件並創建一個基本的信息數據庫。我想在處理配置文件時默認一些值,並且它在第一次循環時工作正常,但隨後的任何條目都會被奇怪地創建(奇怪的是我最好的方式來描述它,因爲它可能是正確的,代碼是錯誤的,因爲代碼正在做我剛纔要求它做的事情,但不一定是我想要做的事情)。使用散列數組填充散列數組
從下面的代碼輸出的樣子:
$VAR1 = [
{
'IPAddress' => '196.8.150.163',
'Boxname' => 'MPLRDFDSOAK1',
'CurrentStatusInfo' => {
'LineHandlersRunning' => [
{
'NumberOfGaps' => 0,
'LineHandlerName' => 'DEFAULT',
'NumberOfCommLinkDowns' => 0,
'LineHandlerUpTime' => 0,
'MemoryUsage' => 0
}
]
},
'PreviousStatusInfo' => {
'LineHandlersRunning' =>
$VAR1->[0]{'CurrentStatusInfo'}{'LineHandlersRunning'}[0]
]
}
},
{
'IPAddress' => '196.8.150.164',
'Boxname' => 'MPLRDFDSOAK2',
'CurrentStatusInfo' => {
'LineHandlersRunning' =>
$VAR1->[0]{'CurrentStatusInfo'}{'LineHandlersRunning'}
},
'PreviousStatusInfo' => {
'LineHandlersRunning' =>
$VAR1->[0]{'PreviousStatusInfo'}{'LineHandlersRunning'}
}
}
];
以下是代碼:
#######################################################################################
# Version History #
#######################################################################################
# example of the ini file
#box=>MPLRDFDSOAK1;ip=>196.8.150.163
#box=>MPLRDFDSOAK2;ip=>196.8.150.164
use strict;
use warnings;
# include the library to allow easy access to command line arguments
use Getopt::Long;
# include the data dumper utility
use Data::Dumper;
my $usageInstructions = "Some instructions\n";
my $showMeTheInstructions = "";
my $iniFileToReadIn = "";
my @boxes;
# read in the command line arguments
GetOptions("ini=s" => \$iniFileToReadIn,
"H|h|?!" => \$showMeTheInstructions);
if ($showMeTheInstructions)
{
print $usageInstructions;
exit 0;
}
readInINIFileIn($iniFileToReadIn, \@boxes) if ($iniFileToReadIn ne "");
print Dumper(\@boxes);
print "\n\#\n\# END OF DATA DUMP\n\#\n\n";
exit 0;
#######################################################################################
# subroutine to read in the ini file and create the empty records for the boxes
# specified
sub readInINIFileIn
{
my ($iniFile, $pointerToBoxes) = @_;
my $noCRLFOnString = "";
# open the file
open (ConfigFile, "<$iniFile") || die $!;
# read in all the lines into an array
my @configurationItems = <ConfigFile>;
# close the file
close (ConfigFile);
# temporary record storage
my %tempRecord;
# create the defaults for all boxes
my @LineHandlersRunning;
my %tmpLineHandlerRunning = (LineHandlerName => "DEFAULT",
LineHandlerUpTime => 0,
NumberOfCommLinkDowns => 0,
NumberOfGaps => 0,
MemoryUsage => 0);
push (@LineHandlersRunning, {%tmpLineHandlerRunning});
my %CurrentStatusInfo;
my %PreviousStatusInfo;
push @{ $CurrentStatusInfo{'LineHandlersRunning'} }, @LineHandlersRunning;
push @{ $PreviousStatusInfo{'LineHandlersRunning'} }, @LineHandlersRunning;
# loop through the config file and create the defaults for the database of boxes
foreach my $configLine (@configurationItems)
{
my @TokenisedLineFromFileItems =();
my @TokenisedLineFromFileNameValuePairs =();
# store parameters
# each line will be ; separated then => separated, as in each one will have a number of items separated by ;'s and
# each item will be be a name & value pair separated by =>'s
@TokenisedLineFromFileItems = split(/;/,$configLine);
# remove quote marks around the outside of each element of the newly created array
s/^"|"$//g foreach @TokenisedLineFromFileItems;
# create information in database record to add to boxes
foreach my $NameValuePair (@TokenisedLineFromFileItems)
{
@TokenisedLineFromFileNameValuePairs = split(/=>/,$NameValuePair);
$noCRLFOnString = $TokenisedLineFromFileNameValuePairs[1];
$noCRLFOnString =~ s/(\n|\r)//g;
$tempRecord{'Boxname'} = $noCRLFOnString if ($TokenisedLineFromFileNameValuePairs[0] eq "box");
$tempRecord{'IPAddress'} = $noCRLFOnString if ($TokenisedLineFromFileNameValuePairs[0] eq "ip");
}
# add all other defaults as blank
$tempRecord{'CurrentStatusInfo'} = {%CurrentStatusInfo};
$tempRecord{'PreviousStatusInfo'} = {%PreviousStatusInfo};
push(@$pointerToBoxes, {%tempRecord});
}
}
它看起來你忘了結束一句話: 「隨後的任何條目都會被奇怪的創建(...)」。 – vezult 2009-10-06 14:02:42
你知道,較長的變量名不一定是較好的變量名。 'TokenisedLineFromFileNameValuePairs',我的意思是,真的嗎?就目前而言,我的大腦無法理解代碼應該做什麼或者正在做什麼。您可以通過花點時間幫助您解決問題:確保Dumper輸出符合要求,確保有一個體面的輸入數據樣本,充分描述程序應該做什麼以及它實際上是什麼這樣做。 *怪異*不是一個好的描述,因爲它是在旁觀者的眼中。 – 2009-10-06 14:08:47
http://thedailywtf.com/Articles/CodeThatDocumentsItselfSoWellItDoesNotNeedComments.aspx – 2009-10-06 14:13:08