Tolgar
asked on
How to pass two arrays to another subroutine in Perl
How can I pass two arrays to another subroutine?
Example:
Example:
my ($result, @failedLineBits) = &helperFunctions::markFailedLines(@line_numbers,@data);
package helperFunctions;
use strict;
use warnings;
sub markFailedLines{
my (@line_numbers, @data) = @_;
SOME CODE IN HERE
return ($result,@out);
}
1;
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
@kaufmed: Ok. I tried your solution and I am getting "Global symbol "@data" requires explicit package name" error.
Here is my whole function:
What am I doing wrong here?
Here is my whole function:
sub markFailedLines{
my ($line_numbers, $data) = @_;
my @out;
if ($line_numbers) {
foreach my $ln ($line_numbers) {
$data[$ln+2] = "<font color=\"red\">$data[$ln+2]</font>";
push(@out, '<br><br>');
push @out, join('<br>', map{ join(': ', $_, $data[$_+2]) } $ln-3..$ln+3);
}
return ('FAILED',@out);
} else {
return ('PASSED',@out);
}
}
What am I doing wrong here?
Do you have any code above sub markFailedLines?
my ($line_numbers, @data) = @_;
foreach my $ln ($line_numbers) {
There's no reason for such a loop over a single element
There's no reason for such a loop over a single element
ASKER
@Ozo: $line_numbers is a reference to an array. It has more than one value in it.
markFailedLines(\@line_num bers,\@dat a);
sub markFailedLines{
my @line_numbers = @{+shift};
my @data = @{+shift};
foreach my $ln (@line_numbers) {
sub markFailedLines{
my @line_numbers = @{+shift};
my @data = @{+shift};
foreach my $ln (@line_numbers) {
ASKER
@kuafmed: Yes there is another sub function. But the error is for the lines 6 and 8 in the above code.
ASKER
@Ozo: Why do I need to use shift? I don't find it very secure to use.
Is there a way of modifying my code above without using shift?
Is there a way of modifying my code above without using shift?
$line_numbers is a reference to an array. It has more than one value in it.It is a single reference.
foreach my $ln ($line_numbers) {
would alias $ln to the single reference
foreach my $ln (@$line_numbers) {
would alias $ln to each of the elements in the referenced array
ASKER
@Ozo: I am confused. Can you please send me the modified version of my code above?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
If $line_numbers is always reference,
if ($line_numbers) {will always be true
#If you call
markFailedLines(\@line_num bers,\@dat a);
#then you can use
sub markFailedLines{
my ($line_numbers, $data) = @_;
my @out;
foreach my $ln (@$line_numbers) {
$data->[$ln+2] = "<font color=\"red\">$data->[$ln+ 2]</font>" ; #note that this modifies the original @data
push @out, '<br><br>',join('<br>', map{ join(': ', $_, $data->[$_+2]) } $ln-3..$ln+3);
}
return @out?'PASSED':'FAILED',@ou t; #this will pass when @line_numbers is not empty
}
markFailedLines(\@line_num
#then you can use
sub markFailedLines{
my ($line_numbers, $data) = @_;
my @out;
foreach my $ln (@$line_numbers) {
$data->[$ln+2] = "<font color=\"red\">$data->[$ln+
push @out, '<br><br>',join('<br>', map{ join(': ', $_, $data->[$_+2]) } $ln-3..$ln+3);
}
return @out?'PASSED':'FAILED',@ou
}
#If you want to pass a copy of @data to prevent the sub from modifying the original, you can call
markFailedLines(\@line_num bers,[@dat a]);
markFailedLines(\@line_num
#Or you can pass only the first array as a reference:
markFailedLines(\@line_num bers,@data );
sub markFailedLines{
my ($line_numbers, @data) = @_;
my @out;
foreach my $ln (@$line_numbers) {
$data[$ln+2] = "<font color=\"red\">$data[$ln+2] </font>";
push @out, '<br><br>',join('<br>', map{ join(': ', $_, $data[$_+2]) } $ln-3..$ln+3);
}
return @out?'PASSED':'FAILED',@ou t;
}
markFailedLines(\@line_num
sub markFailedLines{
my ($line_numbers, @data) = @_;
my @out;
foreach my $ln (@$line_numbers) {
$data[$ln+2] = "<font color=\"red\">$data[$ln+2]
push @out, '<br><br>',join('<br>', map{ join(': ', $_, $data[$_+2]) } $ln-3..$ln+3);
}
return @out?'PASSED':'FAILED',@ou
}
example:
@time = ("hour","minutes");
@date =("day","year");
Push (@time, @date);
Once you have the single array, pass the single array to the sub.