Solved

How to call a subfunction with input and return values in another subfunction in PERL?

Posted on 2011-09-13
5
240 Views
Last Modified: 2012-05-12
Hi,
I have this code as a sub-function (submitFileParser) in another perl code. How can I call this function in another sub-function (processFile) with return values of "@Options, @ALLFiles, @CSS, @RRS, @CRS" ?  and the input ($cache) is another variable in the other sub-function (processFile).

Then I will use these return values in the other sub-function .

Example: (It will be something like this)
sub processFile{

[@Options, @ALLFiles, @CSS, @RRS, @CRS] = submitFileParse($cache);

then I will use these return calues in here
}

Open in new window


      
sub submitFileParser{
my $filename = shift;
my @paragraphs;
{
#   local($/) = '';
    open( FILE, "< $filename" ) or die "Can't open $filename : $!";
    @paragraphs = <FILE>;
    close FILE;
}
our @HEADERS = ("Files", "Comments", "Related Records", "Code Reviewers");

sub read_paragraphs (@) {
	# read lines as parameters
	my @rippedParagraphs = @_;

	# Storage for all sections
	my (@CRS, @RRS, @CSS, @ALLFiles, @Options);
	# Temporary storages for single section of each type
	my (@Files, @CR, @RR, @CS);
	# Flags for file traversal logic
	my ($opt_flag, $file_flag);

	#read the file
	for ( @rippedParagraphs ) {
		# If we encounter a comment or empty string
		if (/^\#/ || !/\S/) {
			# we haven't encountered an option to start doing anything
			next unless $opt_flag || $file_flag;
			# If we're in file reading stage
			if ($file_flag) {
				# Means section reading is over, let's append to the general
				# storage arrays
				push(@ALLFiles, [@Files]) if @Files;
				push(@CRS, [@CR]) if @CR;
				push(@CSS, [@CS]) if @CS;
				push(@RRS, [@RR]) if @RR;
				# and reset temporary storages
				@Files = @CR = @CS = @RR = ();
			}
			# If we're done with options, let's start reading file sections
			if ($opt_flag == 1) {
				$opt_flag = 0;
				$file_flag = 1;
			}
			elsif ($opt_flag > 1) {
				# Addresses the empty line within Options:
				$opt_flag--;
			}
			next;
		}
		if (/^Options/) {
			# We start reading options
			$opt_flag = 2;
			next;
		}
		# Matching beginning of the line to determine the type of the string
		# and placing it in temporary storage
                /^R(R|elated\sRecords):\s*(.*\n)/ && push(@RR, $_) && next;
                /^C(R|ode\sReviewer):\s*(.*\n)/ && push(@CR, $_) && next;
                /^C(S|omments):\s*(.*\n)/ && push(@CS, $_) && next;

#		/^CR:/ && push(@CR, $_) && next;
#		/^CS:/ && push(@CS, $_) && next;
#		/^RR:/ && push(@RR, $_) && next;
		# General text is either files or options info, depending on the
		# value of the option flag
		$opt_flag ? push(@Options, $_) : push(@Files, $_);
	}
	# Let's put the last read section into storages
	push(@ALLFiles, [@Files]);
	push(@CRS, [@CR]);
	push(@CSS, [@CS]);
	push(@RRS, [@RR]);
	# And we return the full datastructure - hashref of populated storage
	return {
		"Options"              => [@Options],
		"Files"                => [@ALLFiles],
		"Comments"             => [@CSS],
		"Related Records"      => [@RRS],
		"Code Reviewers"       => [@CRS],
	};
}
} # submitFileParser

Open in new window

0
Comment
Question by:Tolgar
  • 3
  • 2
5 Comments
 
LVL 9

Expert Comment

by:parparov
ID: 36530527
Your suggestion botches the return values since Perl concatenates several lists into one single list without any delimiters between former ones.
The best way would be:
our @HEADERS = ("Files", "Comments", "Related Records", "Code Reviewers");
sub processFile ($) {
  my $cache = shift;
  my $cache_data = submitFileParser($cache);
  # then use $cache_data like I used it in printing.

}
sub submitFileParser ($) {
  my $filename = shift;
  my @paragraphs;
  local($/) = '';
  open( FILE, "< $filename" ) or die "Can't open $filename : $!";
  @paragraphs = <FILE>;
  close FILE;
  return read_paragraphs (@paragraphs);
}
sub read_paragraphs (@) {
...
}

Open in new window

0
 

Author Comment

by:Tolgar
ID: 36530586
Sorry I am not very clear about how to do it.

Is it possible if you can send me the entire code?

I appreciate for your help.

Thanks,
0
 
LVL 9

Expert Comment

by:parparov
ID: 36531306
What entire code do you need? The sub read_paragraphs remains the same, you may also copy the print_* subroutines from the previous questions and call them in line 6 like
 print_all_data_by_type($cache_data);

Open in new window

0
 

Author Comment

by:Tolgar
ID: 36531646
But i don't wanna print them to anywhere. I just want these variables to be available in the subfunction processFile after I call submitFileParser.

So if I just call this function, are all the return values of submitFileParser be reachable in scope of processFile?

Thanks,
0
 
LVL 9

Accepted Solution

by:
parparov earned 500 total points
ID: 36531710
Exactly. $cache_data will have all the information.
I just said that you can see how the print_* functions access them as an example.
0

Featured Post

Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Perl Sort Question 4 141
unable to remove invisible characters with perl 2 89
add a syntax to a csv file 8 99
XML::LibXML and Xpath syntax How do I get attribute of sibling 2 147
Many time we need to work with multiple files all together. If its windows system then we can use some GUI based editor to accomplish our task. But what if you are on putty or have only CLI(Command Line Interface) as an option to  edit your files. I…
A year or so back I was asked to have a play with MongoDB; within half an hour I had downloaded (http://www.mongodb.org/downloads),  installed and started the daemon, and had a console window open. After an hour or two of playing at the command …
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…

840 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question