2012-02-13 38 views
8

Aşağıdaki üç satırlık kodun dizeyi $ değerine çıkarmayı ve $ başlıkta saklamayı amaçladığını biliyorum. Ama $value =~ s/^\s+//; ve $value =~ s/\s+$//; arasındaki farkların ne olduğunu bilmiyorum.

+0

sadece kayıt için ... "Ben kodları aşağıdaki üç satırı $ değerine dize ayıklamak ve $ başlığında saklayın hedefliyoruz biliyoruz", yok. Scalar $ değerinin uçlarından beyaz boşluk bırakmayı ve onu @header dizisinin $ i-th elemanına yerleştirmeyi amaçlıyorlar. – AmbroseChapel

cevap

10

:

nasıl bir dize başlangıcı/ucundan boşluk şerit mı?

Bir ikame sizin için bunu yapabilir. Tek bir satır için, 'u, tüm ön veya arkadaki boşlukları hiçbir şeyle değiştirmeyeceksiniz. Kombine açıklamada ayrı olanlardan daha yavaştır dışarı o döner rağmen

s/^\s+//; 
s/\s+$//; 

Ayrıca, tek bir ikame olarak bu yazabilirsiniz: değiştirmelerin bir çift ile yapabilirsiniz. Yani olsa sizin için önemli olmayabilir:

s/^\s+|\s+$//g; 

bu düzenli ifade olarak dönüşümlü başına veya dizesinin sonunda ya maçları çapalar münavebe daha düşük öncelik beri. /g bayrağıyla, ikamesi tüm olası eşleşmeleri yapar, böylece her ikisini de alır. Unutmayın, son satırının \s+ ile eşleştiğini ve $ ankrajının dizenin mutlak sonuna denk gelebileceğini unutmayın, böylece yeni satır da kaybolur.


Ve perldoc perlrequick den

: o maç gereken yerde

biz ankrajı metakarakterlerini ^ ve $ kullanmak istiyorsunuz, belirtin. Bağlantı ^, dizenin başlangıcında eşleşmesi anlamına gelir ve $ ankrajı, dizenin sonundaki veya dizenin sonundaki yeni satırdan önce eşleşme anlamına gelir. Bazı örnekler:

"housekeeper" =~ /keeper/;   # matches 
"housekeeper" =~ /^keeper/;  # doesn't match 
"housekeeper" =~ /keeper$/;  # matches 
"housekeeper\n" =~ /keeper$/;  # matches 
"housekeeper" =~ /^housekeeper$/; # matches 
1

^ile başlayan anlamına gelir, $, bu dizeyle sona erer.

+0

'\ z',' $ 'yi değil. '$', dizenin sonunu veya dizenin sonundaki bir satırsonuyla eşleşir. – ikegami

1

İlki, yalnızca satırın başında boşlukları değiştirecektir. perldoc perlfaq4 itibaren