2011-11-21 18 views
9

El siguiente programa consiste en reorganizar una cadena. Para la línea 8, estoy tratando de almacenar los resultados de una expresión regular en una nueva variable $ newdate, pero cuando $ newdate se imprime en la línea 9, solo muestra un 1. ¿Cómo puedo cambiar mi código para que $ newdate almacene el Valor de $ date de la operación de expresiones regularesAlmacenamiento del resultado de expresiones regulares en una nueva variable

1 #!/usr/bin/perl 
2 
3 # This program changes the date format from mm/dd/yyyy to yyyy,mm,dd 
4 
5 $date = '21/11/2011'; 
6 print "Current: $date\n"; 
7 
8 $newdate = $date =~ s/(..)\/(..)\/(....)/$3,$2,$1/; 
9 print "New: $newdate\n"; 

Respuesta

14

También puede hacerlo de esta manera:

my $date = '21/11/2011'; 
print "Current: $date\n"; 
my $newdate; 
($newdate = $date) =~ s/(..)\/(..)\/(....)/$3,$2,$1/; 
print $newdate; 
+0

Gracias - eso es lo que buscaba. – kurotsuki

+0

@kurotsuki Eres bienvenido :) – FailedDev

4

El operador =~ devolverá el número de cambios realizados al hacer la sustitución, ya menos que usted lo está haciendo a nivel mundial, siempre devolverá 1 ó 0. Además, las sustituciones se hacen en el lugar, así que si su objetivo no es modificar $date, no desea sustituir.

Probar:

$date =~ m/(..)\/(..)\/(....)/; 
$newdate = "$3,$2,$1"; 
+0

Gracias por la explicación. – kurotsuki

1

En el espíritu de TIMTOWTDI:

my $date = '21/11/2011'; 

my $newdate = join ",", reverse split m#/#, $date; 

Esto sólo pasa a trabajar porque desea que el orden inverso en los números. También puede hacer esto:

my $newdate = join ",", (split m#/#, $date)[2,1,0]; 

embargo, otra forma:

my $newdate = join ",", reverse ($date =~ /(\d+)/g); 

también: Why use strict and warnings?

10

Desde Perl 5.13.2, la sustitución no destructiva puede ser especificado por el modificador s///r por lo que una se asigna una copia de la cadena de sustitución posterior en lugar de la cantidad de coincidencias. También evita que la cadena original de ser modificados, lo que significa que las dos asignaciones tienen el mismo comportamiento:

(my $new_date = $date) =~ s<(..)/(..)/(....)><$3,$2,$1>; # Pre-5.13.2 

    my $new_date = $date =~ s<(..)/(..)/(....)><$3,$2,$1>r; # Post-5.13.2 

De perldoc perl5132delta: sustitución

no destructivos

El El operador de sustitución ahora admite una opción /r que copia la variable de entrada , lleva a cabo la sustitución en la copia y devuelve el resultado. El original permanece sin modificaciones.

my $old = 'cat'; 
my $new = $old =~ s/cat/dog/r; 
# $old is 'cat' and $new is 'dog' 
Cuestiones relacionadas