arrays - objetos - pasar un arreglo como parametro en java
¿Cómo pasan una matriz y una cadena como argumentos a una función? (5)
Debido a que no puedo encontrar una manera conveniente de verificar si $str
está en @array
, estoy tratando de crear uno yo mismo, pero no está funcionando.
Supongo que es por la confusión de array y string. Sigue dando 0
a $str
. Por favor, hágame saber cómo solucionarlo.
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);
Es posible que desee comprobar cualquiera en el paquete List :: MoreUtils, simplemente utilícelo como:
use List::MoreUtils ''any'';
my @f= qw(1 2 3 4);
my $k=10;
print "yes/n" if( any { $_ == $k } @f );
verifique la documentación en:
perldoc List::MoreUtils.
No puede pasar matrices a subs, solo listas de escalares.
ifin(@f, $k);
es lo mismo que
ifin($f[0], $f[1], $f[2], $f[3], $k);
porque @f
evalúa una lista de sus elementos.
Una forma de pasar una matriz a un sub es pasar una referencia.
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");
Por cierto, eso también se puede escribir como:
my @f = (1,2,3,4);
my $k = 1;
print(( grep { $_ eq $k } @f ) ? 1 : 0, "/n");
Puede mantener la convención de llamadas existente usando 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");
Podrías usar un prototipo, pero esos son algo frágiles. Me gustaría pasar una referencia a @f
como el primer argumento, como este:
use 5.010;
use strict;
use warnings;
sub ifin
{
my ($array,$str)=@_;
for my $i (@$array)
{
if ($i eq $str)
{
return True
}
}
return False
}
my @f= (1,2,3,4);
my $k=1;
print ifin(/@f,$k);
Para una lista larga, evite hacer una copia de todos los elementos de la lista también.
Puede pasar sus argumentos en orden inverso ( print ifin($k, @f);
), por lo que la matriz va en último lugar. Cuando los coges ahora de la subrutina, la secuencia es lo primero y la matriz se llena con cualquier elemento de lista después de ella.
¿Qué tal $str ~~ @arr
en una Smartmatch? Está disponible en Perl 5.10.
use 5.010;
use strict;
use warnings;
my $str = ''three'';
my @arr = qw(zero one two three four);
my @badarr = qw(zero one two four eight);
say ''$str '', $str ~~ @arr? ''is'' : ''is not'', '' in $arr.'';
say ''$str '', $str ~~ @badarr? ''is'' : ''is not'', '' in $badarr.'';
Salida, como se esperaba:
$str is in $arr.
$str is not in $badarr.