"re\x{0301}sume\x{0301}"
dizesini aldım (bu şöyle yazdırılır: re & # x0301; sume & # x0301;) ve onu "e\x{0301}muse\x{0301}r"
(e & # x0301; muse & # x0301; r) olarak değiştirmek istiyorum. reverse
Perl'sini kullanamıyorum çünkü "\x{0301}"
gibi karakterleri ayrı karakterler olarak birleştiriyor, bu yüzden "\x{0301}emus\x{0301}er"
(& # x0301; emus & # x0301; er) almaktan vazgeçiyorum. Dizgiyi nasıl tersine çevirebilirim, ancak yine de birleştiren karakterlere saygı duyarım?Perl'de karakterleri birleştiren bir dizeyi nasıl geri alabilirim?
cevap
iyi cevap ben Chas örneğinin değiştirilmiş biraz as Sinan points out
, Unicode::GCString kullanmaktır:
- "Baskıda geniş karakter" uyarılarından kaçınmak için STDOUT'daki kodlamayı ayarlayın; Temelde tweaks bir çift ile aynı şey
split
bir pozitif ileri yönlü onaylama işlemi (ve hiçbir ayırıcı tutma modu) kullanın. use strict;
use warnings;
binmode STDOUT, ":utf8";
my $original = "re\x{0301}sume\x{0301}";
my $wrong = reverse $original;
my $right = join '', reverse split /(\X)/, $original;
print <<HERE;
original: [$original]
wrong: [$wrong]
right: [$right]
HERE
Sen join
sonra \X special escape grafemler listesini (aralarında boş dizeleri ile) grafemler bir listesini yapmak için split
ile (non-birleştirerek karakter ve aşağıdaki birleştirerek tüm karakterlerle eşleştiğinde) ters onları geri kullanabilirsiniz birlikte:
#!/usr/bin/perl
use strict;
use warnings;
my $original = "re\x{0301}sume\x{0301}";
my $wrong = reverse $original;
my $right = join '', reverse split /(\X)/, $original;
print "original: $original\n",
"wrong: $wrong\n",
"right: $right\n";
(Ben ilk başta olduğu gibi) hakkında grafemler arasındaki boş dizeler vardır neden 'split' ters çevrilmesi nedeniyle, bu: bu verileri kullanır Bu ayırıcı olarak aranıyor. Boş dize, "aradaki" iki grafiktir. Sadece ayırıcıyı dahil ederek, "gerçek" sonuçla karışık grafikleri aldığınız sonucu elde edebilirsiniz - bir dizi boş dizge. Bunun yerine grafikler yakalamak için bir 'm // g' kullanmaktan kaçınan alternatif (ve biraz daha hızlı) bir yöntem:' join '', tersine $ orijinal = ~/(\ X)/g' –
Michael’ın yorumunu açıklığa kavuşturmak için bellek parantezini ayırdığınız bir normal ifadede kullandığınızda, "ayırıcı tutma modu" tetiklenir. Ayrıldığın parçalar arasında geçen şeyi geri alırsın. Ancak bunu yapmak zorunda değilsiniz. Desen (? = \ X), ekstra bir bit olmadan aynı şeyi yapar. Boş dize, küçük dizeler için bu kadar önemli değil. –
"Ayırıcı tutma modu" nu işaret etmekte haklısınız, teşekkür ederim, bu yardımcı oldu. Ancak, (? = \ X) eşdeğer değildir. ispatı için, bu iki örneği ele alalım: bölme/(a) /, "abc" (? = A) /, "abc" ve bölünmüş/(b + c) 'bölme/eşdeğer değildir/"abbcd",/(? = b + c) /, "abbcd" – Flimm
Diğer yanıtların bazıları iyi çalışmayan öğeler içerir. İşte Perl 5.12 ve 5.14 üzerinde test edilmiş bir çalışma örneğidir. Binmode belirtilememesi, çıktının hata mesajları üretmesine neden olur. Bölme içinde pozitif bir göz atma iddiası (ve ayırıcı tutma modu yok) kullanmak, Macbook'umda çıktının yanlış olmasına neden olur.
#!/usr/bin/perl
use strict;
use warnings;
use feature 'unicode_strings';
binmode STDOUT, ":utf8";
my $original = "re\x{0301}sume\x{0301}";
my $wrong = reverse $original;
my $right = join '', reverse split /(\X)/, $original;
print "original: $original\n",
"wrong: $wrong\n",
"right: $right\n";
Sen Unicode::GCString kullanabilirsiniz: Unicode Standard tarafından tanımlanan genişletilmiş sesletim kümelerinden oluşan bir dizi [UAX # 29] 29. Ek olarak
Unicode :: GCString Unicode dize davranır.
#!/usr/bin/env perl
use utf8;
use strict;
use warnings;
use feature 'say';
use open qw(:std :utf8);
use Unicode::GCString;
my $x = "re\x{0301}sume\x{0301}";
my $y = Unicode::GCString->new($x);
my $wrong = reverse $x;
my $correct = join '', reverse @{ $y->as_arrayref };
say "$x -> $wrong";
say "$y -> $correct";
Çıktı: karıştı olanlar için
résumé -> ́emuśer résumé -> émusér
- 1. Iki "/" karakterleri arasındaki dizeyi ayıklamak için nasıl
- 2. phoenix.gen.html'yi nasıl geri alabilirim?
- 3. Eski perlde 'experimental' uyarısı yok
- 4. PyPlot.jl'de, düzgün görüntülenecek unicode karakterleri nasıl alabilirim?
- 5. Lua - Herhangi bir geri dönüşü nasıl alabilirim?
- 6. birleştiren satırlar
- 7. birleştiren desenler
- 8. Electron'da http sonrası yanıtı yakalarken doğru dizeyi nasıl alabilirim?
- 9. Tastypie bir sorguya filtreleri birleştiren
- 10. Bir dizeyi
- 11. DataBound formundaki değişiklikleri nasıl kolayca geri alabilirim?
- 12. Dosyayı niyetle geçirme, nasıl geri alabilirim
- 13. Mac/SSH: Komut hattımı nasıl geri alabilirim?
- 14. Composer'ı Ant yoluyla nasıl geri alabilirim?
- 15. Son silme komutumu mysql'de nasıl geri alabilirim?
- 16. JSJ, nodeJS'de: İşlenen html'yi nasıl geri alabilirim?
- 17. Mercurial'da birden çok işlemi nasıl geri alabilirim?
- 18. facebook fotoğraflarını test kullanıcılarından nasıl geri alabilirim?
- 19. Async/wait kullanarak nasıl geri alabilirim?
- 20. Json ayrıştırılmış dizeyi Json'a geri döndürme
- 21. HTML5 tuvalinde vsync geri arama nasıl alabilirim?
- 22. Apollo durumumu sunucu tarafımdan nasıl geri alabilirim?
- 23. Belirli bir dizeyi arayın ve tüm satırı geri döndürün
- 24. Dizeyi bir unicode karakterine nasıl dönüştürebilirim?
- 25. , Bir dizeyi bir tarih nesnesine nasıl dönüştürebilirim ve yıl, ay ve gün ayrı olarak nasıl alabilirim?
- 26. Dize karakterleri içeren listenin listesini geri döndürme
- 27. Java'da dosyaya yazmak için dizeyi geri baytlara nasıl dönüştürebilirim?
- 28. Bir dizeyi
- 29. İki videoyu birleştiren ffmpeg
- 30. XQuery'de bir dizeyi nasıl açıyorsunuz?
Vay. Perl'i severim, ama bu bölünmüş ifade oldukça büyülüdür. İlk düşüncem “kaba kuvvet” idi: bölünmenin yaptıklarını yapmak için bir işlev yapmak - her bir girişi mantıksal bir karakteri temsil eden dizelerin bir listesini döndürmek. Ancak bu listeyi (@x olarak adlandır) alırsınız, neyse ki, ('', ters (@x)) birleşme kısmı açıktır. – Roboprog
Büyülü? Nasıl yani? Hiçbir yan etkisi olmayan bir regex ve sadece tam olarak gördüğünüz şeyi yapar. Eğer bu sihrin olduğunu düşünüyorsanız, Perl'in gerçek siyah sanatlarını görmediniz. Sen zeki diyebilirsin (yine de söylemem) ama büyülü değil. Muhtemelen hiç kullanmadığın bir şey. –
Bu örneği Perl v5.12.4 kullanarak çalıştırmayı denedim ve işe yaramadı. Bunun yerine/(\ X)/kullanın. Bu soru cevabı Perl'in önceki sürümlerinde çalıştı mı, yoksa sadece belli olanı mı özledik? – Flimm