2011-11-21 10 views
9

Poniższy program służy do zmiany układu ciągu znaków. W przypadku wiersza 8 próbuję zapisać wyniki wyrażeń regularnych w nowej zmiennej $ newdate, ale gdy $ newdate jest drukowane w wierszu 9, wyświetla ona tylko 1. Jak mogę zmienić mój kod tak, aby $ newdate zapisywał Wartość $ date z operacji regex?Przechowywanie wyników regex w nowej zmiennej

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"; 

Odpowiedz

14

Można również zrobić to w ten sposób:

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

Dzięki - po tym właśnie byłem. – kurotsuki

+0

@kurotsuki Serdecznie witamy :) – FailedDev

4

Operator =~ zwróci liczbę zmian dokonanych podczas wykonywania podstawienie i jeśli robisz to na całym świecie, to zawsze zwraca 1 lub 0. Dodatkowo, substytucje są wykonane na miejscu, więc jeśli celem nie jest modyfikacja $date, nie chcesz zastępować.

Spróbuj:

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

Dzięki za wyjaśnienie. – kurotsuki

1

W duchu TIMTOWTDI:

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

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

To właśnie dzieje się z pracy, bo chcesz kolejność w odwrotnej kolejności. Można też to zrobić:

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

Jeszcze innym sposobem:

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

również: Why use strict and warnings?

10

Ponieważ Perl 5.13.2, nieinwazyjne substytucja może być określony przez modyfikatora s///r więc kopia numeru zastępczego zostanie przypisana zamiast liczby dopasowań. Zapobiega to również oryginalnego łańcucha przed modyfikacjami, co oznacza, że ​​dwa zadania mają takie samo zachowanie:

(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 

Z perldoc perl5132delta:

nieniszczące podstawienie

The operator zastępowania obsługuje teraz opcję /r, która kopiuje zmienną wejściową , wykonuje podstawienie na kopii i zwraca wynik w postaci . Oryginał pozostaje niezmieniony.

my $old = 'cat'; 
my $new = $old =~ s/cat/dog/r; 
# $old is 'cat' and $new is 'dog' 
Powiązane problemy