2009-02-02 9 views

cevap

8
s/(?=..$)/:/ 

Roe'in $& önerisini kullanmayın. perldoc perlvar:

Bu değişkenin bir programda herhangi bir yerinde kullanılması, tüm düzenli ifade eşleşmelerinde önemli bir performans cezası verir. Bkz. "BUGS".

+0

Her zaman olduğu gibi, birden fazla yol var. Evet bir performans cezası var, ama aklıma gelen ilk kalıptı (evet, tabii ki aslında baştan çıkarıcı bir adamım) ve muhtemelen bu durumda yeterince hızlıdır, sence de öyle değil mi? :) – falstro

+0

yeterince hızlıydı .. onun zaten gerçekten küçük bir betik ... ayrnieu'nun çözümü de çok çalıştı – CheeseConQueso

+0

Konu hızlı olup olmadığı değil. Buradaki nokta, yeni gelenlerin ilk etapta $ & use kullanma alışkanlığına girmemesidir. – innaM

1

Bu deneyebilirsiniz:

s/..$/:$&/ 

o dizenin sonunda iki karakter ile eşleşir ve iki nokta üst üste ile değiştirir ve eşleşen dize (yani iki karakter). Perl eşdeğer

DÜZENLEME
Sabit sed-backref.

+0

ok sayesinde kullanabilir miyim ... evet ben değil mi yani orada o – CheeseConQueso

+0

güzel çalışma değildi söylemek gidiyordu' En iyileştirilmiş ifade, ama anlamak ve hile yapar, o yardımcı oldu nasıl (yararsızdır)? SO yolunu daha iyi cevaplamıyor mu? – CheeseConQueso

+0

sakınca .. o – falstro

-2

sed en & Perl eşdeğer $ &, bu yüzden olmalı:

$s = s /..$/:$&/s; 
0

Roe cevabı "çalışır", ama onun yerine inobvious regex.

Daha

s/(^.*)(..$)/$1:$2/ 

Çünkü ben sadece aşk backrefs için gider.

Yaptıklarınız için aşırı, ama benim için daha çok anlam ifade ediyor.

+0

ilk yakalama biraz israf, neden sadece s /(..$)/:$ 1 /? – user55400

+0

İlk kısım gerçekten gereksiz olsa da, çok daha okunabilir. (En azından regex ayrıştırmak için) –

+0

+ 1 blixtor. @Kent: Bu durumda pratik bir fark yaratmasa da, orijinal cevabınız daha yavaş olur, çünkü Perl'in sonuncu ".." ile eşleşmesi için iki karakteri geriye alması gerekir. Eğer bu ".." daha karmaşık bir ifade olsaydı, ilk ". *" Bunu kolayca yapabilirdi * çok * daha yavaş. –

9

da ..... yanı

my $string = "1200"; 
substr $string, -2, 0, ':'; 

# $string => '12:00'; 
+0

Substr() 'in okunması daha kolay ve daha sezgisel olarak daha hızlı ve daha hızlı olduğunu düşünürdüm. –

+0

Daha sezgisel olanı yeterince iyi bilmiyorsanız daha sezgisel. – PEZ

+0

bu bir sezgisel görünüyor ... neden bilmiyorum, ama bu csv dosyasında 20 ~ satırları oluşturdu ve sonra bir dökümü aldı ve bana bu hatayı verdi.. /test3 satır 237 dize dışında substr. - en iyi tahmin Verilerimde gerçekleşen ve kötü veri olmayan 0 değerine doğru koştu, sadece bir " – CheeseConQueso