Perl: dizenin başındaki ve sonundaki boşlukları kırpma işlevi


82

Baştaki ve sondaki beyaz boşlukları böyle kırpmak için yerleşik bir işlev var trim(" hello world ") eq "hello world"mı?


3
Bilginize: Perl'deki dizi eşitliği operatör tarafından test edilir eq.
A. Rex

5
Karşılaştığınız tüm soruların biraz açıklığa kavuşturulması: s/^\s+|\s+$//g;vs s/^\s*//; s/\s*$//;İkincisi, bunu yapmanın (her zamankinden çok az) daha deyimsel yoludur, çünkü bu durumda, normal ifade motorunu baştan başlatmak aslında değişmeden daha hızlıdır. Jeffrey Friedl'ın Mastering Regular Expressions adlı kitabında bununla ilgili daha fazla bilgi edinebilirsiniz. (Bu, Perl'in daha yeni bir sürümünde düzeltilmediği sürece, bu durumda lütfen birisi beni düzeltin!)
Hugmeir

4
Java ve .NET arka planından geldiğim için, bunun dile yerleşik olmaması beni neredeyse şok etti! HEPİNİZE TEŞEKKÜRLER!
Landon Kuhn

3
@ landon9720, bir şekilde: Scalar :: Util'in düzeltmesi var ve 5.7.3'ten beri çekirdek - Bu 2002!
Hugmeir

3
Hugmeir, bu yanlış, Eter'in cevabına bakın .
daxim

Yanıtlar:


89

Normal ifade kullanan bir yaklaşım şu şekildedir:

$string =~ s/^\s+|\s+$//g ;     # remove both leading and trailing whitespace

Perl 6, bir kırpma işlevi içerecektir:

$string .= trim;

Kaynak: Wikipedia


5
Buna ayda bir bakıyorum. Ne yazık ki her seferinde yükseltemiyorum.
kyle

82

Bu, şu yöntemle String :: Util'de mevcuttur trim:

Editörün notu: String::Utilbir çekirdek modülü değil, ama sen yükleyebilirsiniz CPAN ile [sudo] cpan String::Util.

use String::Util 'trim';
my $str = "  hello  ";
$str = trim($str);
print "string is now: '$str'\n";

baskılar:

string artık 'merhaba'

Ancak, kendi başınıza yapmanız yeterince kolaydır:

$str =~ s/^\s+//;
$str =~ s/\s+$//;

@ mklement0 ne de olmayacak. Ancak, herkesin CPAN'daki modülleri kullanması gerektiğinden bu konuyla ilgili değildir.
Ether

2
Neden herkes CPAN'daki modülleri kullanmalı? Linux dağıtımınızdan (debian, redhat, ubuntu) manuel olarak kurulmuş CPAN modülleri ile birlikte perl kullanırken tutarlılığı zorlaştırır. Linux dağıtımında paketler olarak bulunan modüller kullanılarak perl'de bir şeyler yapılabilirse çok daha iyidir
Marki555

Marki555 sizin linux dağıtımlarının içinde paketler olarak kullanılabilir modülleri @ olan CPAN - onlar sadece repackaged oldum. Daha önce yapılmadıysa, genellikle belirli bir modülün paketlenmesini talep edebilirsiniz (debian üyeleri özellikle duyarlı ve yardımcıdır).
Ether

1
Onların da CPAN'dan olduklarını biliyorum ... Evet, genellikle debian için yeni bir paket talep edebilirim, ancak yüklü debian kararlı sürümüm için bana yardımcı olmayacak ... bu yüzden paket modüllerini tercih ediyorum, ancak eğer gerçekten gerekli.
Marki555

4
@Ether Kusura bakmayın ama bunun çekirdek dışı bir modül olduğunu bilmekten gerçekten memnunum. Bu gönderi, oldukça basit bir tek satırlık normal ifade yerine bir modül kullanmaktan bahsediyor. Modül çekirdekse, ona çok daha açık olurdum. Bu durumla ilgilidir.
UncleCarl

26

Yerleşik bir trimişlev yoktur, ancak basit bir ikame kullanarak kendi işlevinizi kolayca uygulayabilirsiniz:

sub trim {
    (my $s = $_[0]) =~ s/^\s+|\s+$//g;
    return $s;
}

veya Perl 5.14 ve sonrasında tahribatsız ikame kullanarak :

sub trim {
   return $_[0] =~ s/^\s+|\s+$//rg;
}



3

Text :: CSV kullananlar için bu konuyu buldum ve sonra CSV modülünde anahtarla çıkarabileceğinizi fark ettim:

$csv = Text::CSV->new({allow_whitespace => 1});

Mantık geriye doğrudur, eğer soymak istiyorsanız 1'e ayarlayın. Şekil gidin. Umarım bu herkese yardımcı olur.




2

Ayrıca, metnin içindeki yinelenen boşlukları kırpmak için pozitif bir bakış açısı kullanıyorum:

s/^\s+|\s(?=\s)|\s+$//g

-4

Hayır, ancak aynı sonucu elde etmek için s///ikame işlecini ve \sboşluk iddiasını kullanabilirsiniz.


Bu, yalnızca dizenin her iki ucundaki değil, kelimeler arasındaki boşlukları kaldırır.
DarenW

@DarenW: onu nasıl kullandığınıza bağlı.
Philip Potter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.