2012-02-07 12 views
8

La siguiente secuencia de comandos coincide con las divisiones de dos matrices. Al principio, ambas matrices son iguales y obtengo resultados razonables. Luego modifico una de las matrices y comparto inteligentemente dos nuevas divisiones, pero todavía dice que las rebanadas son idénticas. Sin embargo, cuando copio las divisiones en matrices, la coincidencia inteligente de las matrices muestra que son realmente diferentes.¿Por qué Smartmatch devuelve verdadero al comparar segmentos de matriz que deberían ser diferentes?

El guión:

#!/usr/bin/perl 
use warnings; 
use strict; 
use diagnostics; 

my @x = qw (one two); 
my @y = qw (one two); 
my @x_s; 
my @y_s; 

print "Before change: values are the same:\n"; 
@x_s = @x[0,1]; 
@y_s = @y[0,1]; 
print "\@x_s: @x_s\n"; 
print +(@x[0,1] ~~ @y[0,1]) ? "equal\n" : "not equal\n"; 
print +(@x_s ~~ @y_s) ? "equal\n" : "not equal\n"; 

$x[0]='three'; 

print "After change: values should be different:\n"; 
@x_s = @x[0,1]; 
@y_s = @y[0,1]; 
print "\@x_s: @x_s\n"; 
print +(@x[0,1] ~~ @y[0,1]) ? "equal\n" : "not equal\n"; 
print +(@x_s ~~ @y_s) ? "equal\n" : "not equal\n"; 

La salida:

Before change: values are the same: 
@x_s: one two 
equal 
equal 
After change: values should be different: 
@x_s: three two 
equal 
not equal 

estoy usando Perl 5.10.1, y esto ocurre para ambos segmentos de matriz y las rodajas de patata. ¿Por qué pasó esto?

+1

¿Qué versión de Perl estás usando? Con 'v5.14.2' obtengo' igual', 'igual' y' no igual', 'no igual'. – flesk

Respuesta

5

Parece coincidencia inteligente trabaja en contexto escalar con rodajas.

considerar las siguientes piezas de código:

su caso:

#!/usr/bin/perl 

my @foo = (1,2); 
my @bar = (3,4); 
print @foo[1,2] ~~ @bar[1,2] ? "Equal\n" : "Not equal\n"; 

Eso es probablemente lo que necesita:

#!/usr/bin/perl 

my @foo = (1,2); 
my @bar = (3,4); 
print [ @foo[1,2] ] ~~ [ @bar[1,2] ] ? "Equal\n" : "Not equal\n"; 
+0

¡Eso es todo! Ahora funciona como yo quería. ¡Gracias! – askucins

3

El operador de concordancia inteligente ~~ hace su magia para arreglos, no para listas. Una porción de matriz es una lista, no una matriz.

Actualización:

se puede resolver simplemente encerrando sus rebanadas en los soportes, ya que elimina referencias partido inteligente automáticamente:

print +([@x[0,1]] ~~ [@y[0,1]]) ? "equal\n" : "not equal\n"; 
+0

"Un segmento de matriz es una lista, no una matriz". - ¡¿qué?! – JackTheRandom

+0

@JacktheRandom: https://www.socialtext.net/perl5/array_vs_list – choroba

0

Iniciado por askucins

me encontré con una qui consulta ck en los documentos de Perl relacionados con el comportamiento diferente de esa prueba frente a la versión de Perl y encontré que esto se corrigió en Perl 5.13.5. Ver "Smart Matching contra rebanadas de matriz" en perl5135delta:

Anteriormente, el código siguiente resultó en un partido de éxito:

my @a = qw(a y0 z); 
my @b = qw(a x0 z); 
@a[0 .. $#b] ~~ @b; 

Este comportamiento extraño ya se ha solucionado [perl #77468].

Cuestiones relacionadas