Tolgar
asked on
How to call a subfunction with input and return values in another subfunction in PERL?
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)
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
}
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
ASKER
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,
Is it possible if you can send me the entire code?
I appreciate for your help.
Thanks,
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);
ASKER
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,
So if I just call this function, are all the return values of submitFileParser be reachable in scope of processFile?
Thanks,
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
The best way would be:
Open in new window