una pasar parametro objetos matriz matrices llenar funcion como cadenas arreglo array arrays string perl function parameters

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.