2009-05-19 24 views

cevap

10

değerine 128 and higher var, sadece tek tek karakterler ord arayıp şu değeri> = 128. olanlar işleyebilir kod stdin ve baskılar sadece genişletilmiş ASCII karakter okur:

while (<>) { 
    while (/(.)/g) { 
    print($1) if (ord($1) >= 128); 
    } 
} 

Alternatif chr birlikte unpack da çalışacaktır. Örnek:

while (<>) { 
    foreach (unpack("C*", $_)) { 
    print(chr($_)) if ($_ >= 128); 
    } 
} 

(ı ... bazı Perl guru iki tek gömlekleri için bunlardan ikisi yoğunlaşmak eminim)


yerine satır numaralarını yazdırmak için aşağıdaki kullanabilirsiniz (Bu çiftleri kaldırmaz ve unicode geçirildiğinde tek davranış olacaktır):

while (<>) { 
    while (/(.)/g) { 
    print($. . "\n") if (ord($1) >= 128); 
    } 
} 

(. Teşekkür Yaakov Belch$. ucu için)

+0

Çok yavaş ve etkisiz bir yaklaşımdır Dave Sherohman en çözümünü http://stackoverflow.com/questions/881931/how-to-print-numbers-of-line-containing-extended-ascii-characters bakın -in-perl/882113 # 882113 Bu çok daha hızlı ve daha basittir. –

+0

Bu cevap Dave'den önce yayınlandı. Dave'in yaklaşımını gördüm ve çoğu durumda tercih edilmesi gerekiyor. Bu sadece bir Perl acemi olduğumu gösteriyor. Bu cevabı silmemeyi tercih ediyorum çünkü son bölüm tam olarak ne istediğini yapıyormuş gibi görünüyor. Ayrıca bkz. Http://stackoverflow.com/questions/882122/reading-a-file-char-by-char-and-checking-for-extented-ascii-char – Stephan202

+0

... ah, bu sayfa silinmiştir. Söylemek yeterlidir, soru, her bir * genişletilmiş ASCII karakteri için satır numarasının basılması gerektiğini belirtmiştir. Benim çözümüm budur. – Stephan202

7

İlk yazdırılabilir ASCII karakteri space (32). Son yazdırılabilir ASCII karakteri ~ (126). o, kuşkusuz, aynı zamanda kontrol karakterleri yanı sıra uzun süreli ASCII içeren satırları görüntüler rağmen Yani muhtemelen

while (<>) { 
    print "$.\n" if /[^ -~]/; 
} 

kullanmayı tercih ediyorum.

Düzenleme: Satır yerine satır numarası yazdırmak için değiştirildi.

+1

yerine satırının satır numarasını yazdırmak için kolay: süre (<>) -; Bu belirtilen problemi –

+0

Whoops çözmek gerekir {baskı eğer/[^ ~]/"$ \ n."}! Sadece soruyu kendim okuyordum ve başlıkta istediği satırın istediğini belirtti. Yakalama için teşekkürler. –

5

Oneliner: eski perl sürümleri

için

perl -nE'say$.if/[\xE0-\xFF]/' 

perl -lne'print$.if/[\xE0-\xFF]/' 
2

Çok önemli bir soru

kullanım bayt olsun; Pragma geçerli olmalıdır. Poster buna karar vermeli. 127 daha büyük kodları ile karakterleri toplama için aşağıdaki yeterli olacaktır:

print grep 127 < ord, split // while <>; 

veya

print grep /[^[:ascii:]]/, split // while <>; 
1

Hynek -Pichi- Vychodil cevabı:

perl -nE'say$.if/[\xE0-\xFF]/' 

sadece sınırlı bir bölümünü test eder Baskı yapılmaması durumunda muhtemelen

Bunun yerine,

.

1

Grep'ten ne haber?

grep [\x00-\x1F\x7F-\xFF]+ * 
İlgili konular