perl script :making array

Hi ,

i have a perl script which takes 'csv; file as input parameter and performs some tasks.
CSV file format :
MAGENTF,AGENTF8,mahfr001,tksfr01,. ./.profile 1>/dev/null 2>&1;ps -fe|grep 'gn1avm_agent -n AGENTF8'|grep gn1avm_agent|tr -s '[ ]' '[ ]'|cut -d ' ' -f 3|xargs kill -9,,. ./.profile 1>/dev/null 2>&1;gn1avm_runproc_Ksh -e OLC1AVMA -n AGENTF8 &,,ps -fu \$LOGNAME | grep 'gn1avm_agent -n AGENTF8$'|grep -v grep

here it takes first column as GROUP.

output :-
script.pl file.csv
it will give a list (based on first column i mentioned above as GROUP)
        0) MAGENTF
        1) MAGENTR
        2) MCDR

but this script can select only one option and will proceed with its given action. if i select opyions 1 and then 2 , it will take all daemons mentioned under group 2 (MCDR). i want it to handle more than 1 option (handle more than 1 GROUP). so if i select 1 and 2 , it can take both group daemons and perform its action given on next page.

this perl script is making 2D array , part of code is below:-

$CHOSENAPP=();
%CHOOSEN_LOGICIAL_NAME_Hash=();
$CHOSENACTION=();

%Unique_APPS_Hash=();
%Unique_NAMES_Hash=();

#### OPEN INPUT CONFIG  FILE  AND READ INTO 2 DIMENSIONAL ARRAY #################
sub read_config
{
	open(FILE_IN, "<$DIR/$FILE" ) || &File_Error;

	$X=0; #initialize count of lines in file and array
	while ( <FILE_IN> )
	{
		if ($_ =~ /^#/)
		{ if ($REPORT>=1){print "\nIGNORED COMMENT: $_\n";} }
		else
		{
			chomp($_); # remove xtra return character at end of line
			@line=split(/,/, $_); #split line on comma
			for $Y ( 0 .. $#line ) # number of items in array as split by comma
 			{
				$ConfigFileArray[$X][$Y]=@line[$Y]; # assign item to 2D array
 				if ($REPORT>=1){print " :$ConfigFileArray[$X][$Y]: ";}
			}
			$X++; # increment count of lines
			if ($REPORT>=1){print "\n";}
		}
	}
	close(FILE_IN);
}
#### END OPEN INPUT CONFIG  FILE  AND READ INTO 2 DIMENSIONAL ARRAY #################



### report the contents of 2D array ConfigFileArray ###
sub report_array_contents
{
	print "ARRAY CONTAINS:\n";
	for $X ( 0 .. $#ConfigFileArray ) { for $Y ( 0 .. $#{$ConfigFileArray[$X]} ) { print " :$ConfigFileArray[$X][$Y]: "; } print "\n"; }
}
### END report the contents of 2D array ConfigFileArray ###



##### Make unique list of APPS and LOGICIAL NAMES, store them in  HASHs ####
sub make_unique
{
	for $X ( 0 .. $#ConfigFileArray)
	{
		$Unique_APPS_Hash{$ConfigFileArray[$X][0]}++;
		$Unique_NAMES_Hash{$ConfigFileArray[$X][1]}++;if ($Unique_NAMES_Hash{$ConfigFileArray[$X][1]} > 1){print "LOGICIAL NAMES MUST BE UNIQUE< PLEASE CHECK THE CONFIG FILE! EXITING NOW\n";exit 1}
	}
	if ($DEBUG>=5)
	{
		print "APPS hash\n"; foreach $key (keys %Unique_APPS_Hash){print  "$key $Unique_APPS_Hash{$key}\n";}
		print "NAME hash\n"; foreach $key (keys %Unique_NAMES_Hash){print  "$key $Unique_NAMES_Hash{$key}\n";}
		print "\n\n";
	}
}
##### END Make uniques list in HASH of APPS and LOGICIAL NAMES ####
#### Menu to Stop or Start ###
sub action_menu
{
	@ACTION=('','STOP','START','CHECK');
	while ( $MYACTION eq '' )
	{
		menu_header();
		print "Screen 3 of 4\n";

		print "Choose the ACTION: \n\n";
		print "\tE) EXIT\n";
		print "\tC) CLEAR chosen ACTION\n";
		print "\tD) I'm DONE chosing, proceed to next menu\n\n";
		print "\t1) STOP\n\t2) START\n\t3) CHECK\n";
		sysread(STDIN,$MYACTION,2); chomp ($MYACTION);
		print $clear_string;	

		if ($MYACTION =~ /^[eE]$/) {action_info ("EXIT");exit 1;}
		elsif ($MYACTION =~ /^[1-3]$/) { action_info ($ACTION[$MYACTION]);$CHOSENACTION=$ACTION[$MYACTION];$MYACTION='';}
		elsif ($MYACTION =~ '^[cC]$') { action_info ("CLEAR"); $CHOSENACTION=(); $MYACTION=''; }
		elsif ($MYACTION =~ '^[dD]$') {action_info ("DONE");if (! $CHOSENACTION){print "\n\nERROR: you must choose an ACTION to proceed\n\n";$MYACTION='';}}
		else {action_info ("Invalid choice");$MYACTION='';}
	}
}

does it help to understand ?
i have no perl idea. let me know if smoething more is required .

It might be helpful if you post the part of the script that shows the menu above, and processes the user input thereafter.

tyler_durden

here is that:-

while ( $MYNAME eq '' )
	{
		menu_header();
		print "Screen 2 of 4\n";
		print "Choose the LOGICIAL ENVIRONMENT to work on: \n\n";
		@Unique_NAMES_Array=();
		for $X ( 0 .. $#ConfigFileArray) # make array of logicial names based on APP choice
		{
			if ($ConfigFileArray[$X][0] eq $CHOSENAPP)
			{ push (@Unique_NAMES_Array,$ConfigFileArray[$X][1]);}
		}
	
		print "\tE) EXIT\n";
		print "\tA) ALL envs listed below\n";
		print "\tC) CLEAR chosen envs\n";
		print "\tD) I'm DONE chosing, proceed to next menu\n\n";
		for $Z ( 0 .. $#Unique_NAMES_Array)
		{
			print "\t$Z) $Unique_NAMES_Array[$Z]\n";
		}
	
		sysread(STDIN,$MYNAME,3); chomp ($MYNAME);
		
		print $clear_string;	
		if ($MYNAME =~ '^[eE]$') {action_info ("EXIT");exit 1;}
		elsif (($MYNAME =~ /^[0-9]*$/) && ($MYNAME <= $#Unique_NAMES_Array)) { action_info ($Unique_NAMES_Array[$MYNAME]); $CHOOSEN_LOGICIAL_NAME_Hash{$Unique_NAMES_Array[$MYNAME]}++; $MYNAME=''; }	
		elsif ($MYNAME =~ '^[cC]$') { action_info ("CLEAR"); delete @CHOOSEN_LOGICIAL_NAME_Hash {keys %CHOOSEN_LOGICIAL_NAME_Hash}; $MYNAME=''; }
		elsif ($MYNAME =~ '^[aA]$') { action_info ("ALL"); foreach $item(@Unique_NAMES_Array) { $CHOOSEN_LOGICIAL_NAME_Hash{$item}++; }; $MYNAME=''; }
		elsif ($MYNAME =~ '^[dD]$') {action_info ("DONE");if (! %CHOOSEN_LOGICIAL_NAME_Hash){print "\n\nERROR: you must choose an ENV to proceed\n\n";$MYNAME='';}}
		else {action_info ("Invalid choice");$MYNAME='';}
	}
}


#### get the commands from the array ####
sub get_commands
{
	# copy for each env from Config file array the commands to use for childs process into new 2 D array
	foreach $env_item (keys %CHOOSEN_LOGICIAL_NAME_Hash)
	{
		if ($REPORT >=  1){print " $env_item\n ";}
		for $X ( 0 .. $#ConfigFileArray ) 
		{ 
			if ( ($ConfigFileArray[$X][1] eq $env_item) && ($ConfigFileArray[$X][0] eq $CHOSENAPP) )
			{
				if ($CHOSENACTION eq 'STOP')
				{ push (@commands_array,[$env_item,$ConfigFileArray[$X][2],$ConfigFileArray[$X][3],$ConfigFileArray[$X][4],$ConfigFileArray[$X][5]]); }
				elsif ($CHOSENACTION eq 'START')
				{ push (@commands_array,[$env_item,$ConfigFileArray[$X][2],$ConfigFileArray[$X][3],$ConfigFileArray[$X][6],$ConfigFileArray[$X][7]]); }
				elsif ($CHOSENACTION eq 'CHECK')
				{ push (@commands_array,[$env_item,$ConfigFileArray[$X][2],$ConfigFileArray[$X][3],$ConfigFileArray[$X][8],'']); }
			}
		} 
	}

	if ($DEBUG >=  2){
		for $X ( 0 .. $#commands_array ) 
		{print "$commands_array[$X][0] $commands_array[$x][1] $commands_array[$X][2] $commands_array[$X][3] $commands_array[$X][4]\n";}
		}
}

#### FORK the child processes and run the commands ###
sub fork_child_action
{
	if ($REPORT >=  1){print "\n\nForking the commands now....\n";}
	for $X ( 0 .. $#commands_array ) 
	{
		if ($cpid != 0)#this prevents endless loop
		{
			$cpid=fork(); # fork a new process identical to this one, and start eexcuting from here
			
			if ($cpid < 0) # error
			{ 
				print "ERROR: Unable to Fork! exit 1\n"; exit 1;
			}
			elsif ($cpid > 0) # fork returns the new process id of the child, the parent knows the childs pid now
			{ 
				if ($REPORT >=  1){print " $env_item childs process id is $cpid\n"; }

				#PUT my process ID into the array
				$commands_array[$X][5]=$cpid;
			}
			elsif ($cpid == 0) # in the child process, the pid is 0, so i'm a child, continue to process
			{
				#GET the valuse from array
				$env=$commands_array[$X][0];
				$host=$commands_array[$X][1];
				$wrk_account=$commands_array[$X][2];
				$command1=$commands_array[$X][3];
				$command2=$commands_array[$X][4];

				if ($DEBUG >=  2){print "$env CHILD FORKING HERE\n"; print "FORK COMMANDS: $env $host $wrk_account $command1 $command2\n";}
				
				open(FILEOUT, ">>".$LOG."/Emergency_".$env."_".$host."_".$wrk_account.".log") || die("Could not open log file for output");
				$TIMESTAMP= getTimeStamp();
				print FILEOUT "BEGIN $CHOSENACTION $TIMESTAMP $env $host $wrk_account $command1, $command2\n";

				if ( $command1 )
				{
				
					if ($REPORT >=  1){print "Issuing command1 $command1  TO $env $host $wrk_account \n";}
					
					open (STDOUT, ">>".$LOG."/Emergency_".$env."_".$host."_".$wrk_account.".stdout.log") || die("Could not open log file for output");
					open (STDERR, ">>".$LOG."/Emergency_".$env."_".$host."_".$wrk_account.".stdout.log") || die("Could not open log file for output");
					system ("ssh \-o \"StrictHostKeyChecking=no\" \-o 'BatchMode yes' \-q $wrk_account\@$host \"$command1\"") ;
					$exit_status=$?;
					close (STDOUT);
					close (STDERR);

anyone can help ?