2011-11-21 38 views
9

Aşağıdaki program bir dizgiyi yeniden düzenlemek içindir. 8. satır için, bir regex'in sonuçlarını yeni bir değişken $ newdate olarak kaydetmeye çalışıyorum, ancak $ newdate 9. satırda yazdırıldığında, yalnızca 1 görüntülenir. Kodumu nasıl değiştirebilirim ki $ newdate Normal tarih değerinden normal tarih değeri?Regex sonucunu yeni bir değişkende saklama

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

cevap

14

Ayrıca böyle yapabilirdi:

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

Teşekkürler - ben de peşimdeydim. – kurotsuki

+0

@kurotsuki Rica ederim :) – FailedDev

4

=~ operatör ikame yaparken yapılan değişikliklerin sayısını döndürür ve küresel yapıyoruz sürece eğer, her zaman 1 veya 0. Ayrıca, oyuncu değişikliği yerinde yapılır dönmek, bu yüzden olacak senin amaç $date değiştirmek değil, yerine koymak istemiyorsunuz.

Dene:

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

teşekkürler. – kurotsuki

1

TIMTOWTDI ruhu içinde: Bu sadece istediğiniz çünkü çalışmak olur

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

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

sayıların tersi. Ayrıca yapabilirsiniz:

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

bir diğer adres: Ayrıca

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

: Why use strict and warnings?

10

Perl 5.13.2 beri, tahribatsız ikame s///r değiştirici aracılığıyla belirtilebilir yüzden Eşleşme sayısı yerine yerine ikame dizesinin kopyası atanır.

(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 

perldoc perl5132delta kaynaktan:

tahribatsız ikame

Ayrıca iki atamaları aynı davranışı anlamına gelir değiştirilmiş olan özgün dize önler ikame operatörü şimdi giriş değişkenini kopyalayan bir /r seçeneğini destekliyor, gerçekleştiriyor kopyadaki ikame ve sonuç döndürür. Orijinal, değiştirilmemiş kalır. açıklama için

my $old = 'cat'; 
my $new = $old =~ s/cat/dog/r; 
# $old is 'cat' and $new is 'dog' 
İlgili konular