Realmente no puede hacer lo que desea porque la función de sustitución devuelve 1
si funcionó o una cadena vacía si no funcionó. Esto significa que si usted hizo esto:
doStuff($foo =~ s/regex/replacement/);
La función doStuff
estaría utilizando ya sea 1
o una cadena vacía como parámetro. No hay ninguna razón por la cual la función de sustitución no pueda devolver la cadena resultante en lugar de solo 1
si funcionó. Sin embargo, fue una decisión de diseño desde los primeros días de Perl. De lo contrario, ¿qué pasaría con esto?
$foo = "widget";
if ($foo =~ s/red/blue/) {
print "We only sell blue stuff and not red stuff!\n";
}
La cadena resultante es todavía widget
, pero la sustitución fallado en realidad. Sin embargo, si la sustitución devolviera la cadena resultante y no una cadena vacía, el if
seguiría siendo verdadero.
Entonces, considere este caso:
$bar = "FOO!";
if ($bar =~ s/FOO!//) {
print "Fixed up \'\$bar\'!\n";
}
$bar
es ahora una cadena vacía. Si la sustitución devuelve el resultado, devolverá una cadena vacía. Sin embargo, la sustitución realmente tuvo éxito y quiero que mi if
sea cierto.
En la mayoría de los idiomas, la función de sustitución devuelve la cadena resultante, y que tendría que hacer algo como esto:
if ($bar != replace("$bar", "/FOO!//")) {
print "Fixed up \'\$bar''!\n";
}
Por lo tanto, debido a una decisión de diseño de Perl (básicamente para imitar mejor awk
sintaxis) , no hay una manera fácil de hacer lo que quieres.Sin embargo se podría haber hecho esto:
($foo = $bar) =~ s/regex/replacement/;
doStuff($foo);
Eso haría un lugar en el establecimiento de $foo
sin antes asignándole el valor de $bar
. $bar
se mantendrían sin cambios.
duplicados http://stackoverflow.com/questions/3321400/how-to-do-perl-inline-regex-without-setting-to-a- variable – daxim