Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do pass one array and one string as arguments to a function?

Because I can't find a convenient way to check if $str is in @array, I'm trying to make one myself, but it is not working.

I guess it is because of the mix-up of array and string. It keeps giving 0 to $str. Please let me know how to fix it.

use 5.010;
use strict;
use warnings;

sub ifin {
    my (@array, $str) = @_;
    for my $i (@array) {
        if ($i eq $str) {
            return 1;
        }
    }
    return 0;
}

my @f = (1, 2, 3, 4);
my $k = 1;
print ifin(@f, $k);
like image 623
Ivan Wang Avatar asked Dec 13 '22 02:12

Ivan Wang


1 Answers

You can't pass arrays to subs, only lists of scalars.

ifin(@f, $k);

is the same as

ifin($f[0], $f[1], $f[2], $f[3], $k);

because @f evaluates to a list of its elements.

One way of passing an array to a sub is to pass a reference.

sub ifin {
   my ($array, $str) = @_;
   for my $e (@$array) {
      return 1 if $e eq $str;
   }

   return 0;
}

my @f = (1,2,3,4);
my $k = 1;
print(ifin(\@f, $k), "\n");

By the way, that can also be written as:

my @f = (1,2,3,4);
my $k = 1;
print(( grep { $_ eq $k } @f ) ? 1 : 0, "\n");

You could keep the existing calling convention by using pop.

sub ifin {
   my $str = pop(@_);
   for my $e (@_) {
      return 1 if $e eq $str;
   }

   return 0;
}

my @f = (1,2,3,4);
my $k = 1;
print(ifin(@f, $k), "\n");
like image 191
ikegami Avatar answered Jan 16 '23 05:01

ikegami