2010-02-06 12 views
5

Tengo el siguiente código:¿Por qué Perl reemplaza mi cadena con "1"?

#$domain = domainname.co.uk 
#$root = public_html 
#$webpage = domainname.co.uk/foo/bar/foobar.html 
my $string = ($webpage =~ s/^$domain//g); 
my $linkFromRoot = $dbh->quote($root . $string); 

Solemos esto funciona bien, pero por alguna razón, la salida es "public_html 1" en lugar de "public_html/foo/bar/foobar.html".

¿Alguien puede ver por qué?

+5

Cuando se encuentre con estos problemas, comience a bisectar su código para encontrar dónde se muestran los datos del problema. En este caso, verificaría el valor de '$ string' antes de usarlo, descubriría que es' 1', luego leería en el operador de sustitución para ver qué está haciendo. :) –

+1

Off-topic nuevamente, pero ¿por qué DBI 'quote' en lugar de placeholders? :) – hobbs

Respuesta

11

No está recibiendo la respuesta correcta, porque la sustitución se vuelve 1, que es el número de elementos sustituidos. Véase la respuesta perlfaq4 's a How can I count the number of occurrences of a substring within a string?

$domain = "domainname.co.uk"; 
$root = "public_html"; 
$webpage = "domainname.co.uk/foo/bar/foobar.html"; 
my $string = ($webpage =~ s/^$domain//g); 
print $string."\n"; 

Retire la $string y sólo hacer $webpage =~ s/^$domain//g; y luego hacer la concatenación de cadenas con $webpage.

0

¿Qué tal

$webpage =~ s/^$domain//g; 
my $linkFromRoot = $dbh->quote($root . $webpage); 
7

Creo que está asumiendo que los paréntesis alrededor de la expresión regular inducen un contexto de lista. Que es no el caso. La izquierda del operador de asignación determina el contexto y es escalar. En contexto escalar, s /// devuelve el número de sustituciones exitosas. Poner paréntesis alrededor de la variable de variable declarada hace que haga lo que usted quiere que haga, ya que crea un contexto de lista.

Este:

my ($string) = $webpage =~ s/^$domain//; 

devolvería la parte partidos de $ página web: el nombre de dominio. Esto probablemente no es lo que quieres. O se desea código de S.Mark:

$webpage =~ s/^$domain//; 
my $linkFromRoot = $dbh->quote($root . $webpage); 

O esto

my ($string) = $webpage =~ /^$domain(.+)$//; 
my $linkFromRoot = $dbh->quote($root . $string); 
+0

Me gusta que hayas explicado el posible error en el contexto de comprensión. Es un tema demasiado importante en Perl como para perder la oportunidad de reforzarlo. – HerbN

4

totalmente fuera del tema de su pregunta original, pero es posible que lo que realmente quería era:

my $webpage = URI->new("http://domainname.co.uk/foo/bar.html"); 
my $path = $webpage->rel("http://domainname.co.uk/"); 
print "public_html/$path\n"; 
0

Si no necesita otra variable, creo que las respuestas anteriores son mejores, pero uno de mis pequeños trucos de sintaxis favoritos es aprovechar el hecho de que la asignación es un valor l, por lo que con una pequeña reorganización de el paréntesis:

(my $string = $webpage) =~ s/^$domain//g; 

puede hacer una copia y modificarla en una sola declaración.

Además, junto con las otras cosas que son un poco raras acerca de este código, no hay mucho sentido para ese /g en un patrón que comienza con ^. No puede coincidir más de una vez.

Cuestiones relacionadas