2010-07-23 13 views
9

Normalde bunu:Bir değişkene ayarlanmadan perl satır içi regex nasıl yapılır? Eğer regex ile bir değişkeni değiştirmek isterseniz

$string =~ s/matchCase/changeCase/; 

Ama değişkene geri ayarlamadan inline yerini yapmak basitçe bir yolu var mı?

böyle bir şey kullanmak isteyen: tür PHP'de preg_replace fonksiyonu gibi böyle

my $name="jason"; 
print "Your name without spaces is: " $name => (/\s+/''/g); 

şey.

+1

ikame operatörünün arayüzü iyi değil tasarımı. [(Bu kez bir kez böyle bir şey söyledim.)] (Http://stackoverflow.com/questions/3319170#comment-3443516) [p5p] 'de konuşma var (http://www.socialtext.net/perl5 /index.cgi?p5p) bir bayrak eklemek için değiştirilen dizgiyi döndürür. – daxim

cevap

11

Perl 5.14 için gözden geçirilmiştir. 5.14 yana

, /r bayrak dönüş için ikame ile bunu yapabilirsiniz: Sen map ve bir sözcük değişkeni kullanabilirsiniz

print "Your name without spaces is: [", do { $name =~ s/\s+//gr; } 
    , "]\n"; 

.

my $name=" jason "; 

print "Your name without spaces is: [" 
    , (map { my $a = $_; $a =~ s/\s+//g; $a } ($name)) 
    , "]\n"; 

Şimdi, _ takma ve böylece değişken değiştirir $ çünkü sözlü bir kullanmak zorunda.

çıkış

Your name without spaces is: [jason] 
# but: $name still ' jason ' 

Kuşkusuz do gibi iyi (ve belki de daha iyi) çalışacak

print "Your name without spaces is: [" 
    , do { my ($a = $name) =~ s/\s+//g; $a } 
    , "]\n"; 

olduğunu Ama sözcük kopyalama hala var. my'daki ödev, bazı kişilerin tercih ettiği (beni değil) bir kısaltmadır. bu deyim için

, ben filter diyoruz bir operatör geliştirdik:

sub filter (&@) { 
    my $block = shift; 
    if (wantarray) { 
     return map { &$block; $_ } @_ ? @_ : $_; 
    } 
    else { 
     local $_ = shift || $_; 
     $block->($_); 
     return $_; 
    } 
} 

Ve şöyle diyoruz:

print "Your name without spaces is: [", (filter { s/\s+//g } $name) 
    , "]\n"; 
+3

Veya "map" kullanmadan sözcüksel bir değişken kullanabilirsiniz: "print" Adınız boşluksuz: [", do {my $ a = $ name; $ A = ~ s/\ s + // g; $ a}, "] \ n" ' – mob

+1

@mobrule: Yazdıkça bunu ekliyordum. : D – Axeman

+0

Daha fazla açıklaması olduğu için bunu kabul etti. –

1
print "Your name without spaces is: @{[map { s/\s+//g; $_ } $name]}\n";