2013-05-09 17 views
6

Postacı tabanlı posta listelerini yönetmek için listadmin kullanıyorum. Uzun bir konu listesi ve spam'i engellemek için ayarlanmış adreslerim var.Perl: Nasıl yapılır: FULLWIDTH LATIN SMALL

Konu: Son zamanlarda, güzel görünümlü Unicode karakterleri, örneğin kullandığı anlamda akıllı spam aldım Al l reklam ön muamele mov bizim Exx için ompari- ng c nare şey görmüyoruz ettik ies HD 'da 13' 000 mov i'lerinin xci ti ng derlemesi y ou için artık geçerli!

veya

Konu: HD olmaz vi grafiğini oluşturmak için bir d pho EOS d y yanan s o f
u

için burada ho tc HIC ks Şimdi istiyorum Bunu engellemek için akıllı bir Perl regex kullanın. Bu nesneleri hexdump'a pipetlemek birçok karakterin FULLWIDTH LATIN SMALL LETTER olduğunu ortaya çıkardı. Ancak, \p{FULLWIDTH LATIN SMALL LETTER} çalışmıyor: Can't find Unicode property definition "FULLWIDTH LATIN SMALL LETTER"

Soru şu: Bu tam geniş karakterlerle eşleştirmek için \p{something} var mı? Alternatif olarak: bu karakterleri eşleştirmek için başka bir yol var mı?

cevap

8

Sayfa perlunicode kullanılabilir belgeler unicode karakter sınıfları. Özel karakter sınıflarını ve reesekslerde \p{...} gibi ters eğik çizgileri belgeleyen perlrebackslash'ta bir başvuru kaynağı olarak buldum.

Özet, ancak en yaygın özellik sınıflarının, özellik tipi ve : veya = ile ayrılan bir özellik değeri gerektirmesidir. Bununla birlikte, önceden tanımlanmış bir özellik olarak tam genişlikte karakterlerden bahsedilmiyor.

Ama Halfwidth and Fullwidth Forms (U+FF00 - U+FFEF) olabilir Block/Blk özelliği yoktur değer olarak:

/\p{Block=Halfwidth and Fullwidth Forms}/ 

Bu, girdiğiniz bilgilere maç olacak (v16.3 üzerinde test). Bunun için


yararlı bir araç uniprops olup.

$ uniprops U+FF41 
U+FF41 ‹a› \N{FULLWIDTH LATIN SMALL LETTER A} 
    \w \pL \p{LC} \p{L_} \p{L&} \p{Ll} 
    All Any Alnum Alpha Alphabetic Assigned InHalfwidthAndFullwidthForms 
    Cased Cased_Letter LC Changes_When_Casemapped CWCM 
    Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT 
    Changes_When_Uppercased CWU Ll L Gr_Base Grapheme_Base Graph GrBase 
    Halfwidth_And_Fullwidth_Forms Hex XDigit Hex_Digit ID_Continue IDC 
    ID_Start IDS Letter L_ Latin Latn Lowercase_Letter Lower Lowercase 
    Print Word XID_Continue XIDC XID_Start XIDS X_POSIX_Alnum 
    X_POSIX_Alpha X_POSIX_Graph X_POSIX_Lower X_POSIX_Print X_POSIX_Word 
    X_POSIX_XDigit 

Gördüğünüz gibi

, \p{Block=Halfwidth and Fullwidth Forms} da \p{In Halfwidth and Fullwidth Forms} yazılabilir.

+0

çok teşekkürler @ikegami aydınlatıcı düzenleme ve bağlantılı eğlenceli modülü için. – amon

+0

Bu tchrist'in biri. 'unichars', sohbeti yapmak için kullanılabilir. Örneğin. 'unichars -au '\ p {InHalfwidthAndFullwidthForms}', HalfwidthAndFullwidthForms satırındaki karakterleri listeler. – ikegami

4

Onların kodlarından karakter isimleri almak için charnames::viacode kullanabilirsiniz:

#!/usr/bin/perl 
use warnings; 
use strict; 
use utf8; 

use charnames qw(); 


my $string = q(Subject: Al l the ad ult mov ies you' ve see n a r e nothing) 
      .q(c ompari- ng t o our exx xci t i ng compilation of 13' 000) 
      .q(mov ies in HD t hat are a v ailable for y ou now!); 

my $count = grep /FULLWIDTH/, map charnames::viacode(ord), split //, $string; 
print "$count fullwidth characters.\n"; 
İlgili konular