2009-05-19 31 views

Trả lời

10

Kể từ khi ASCII ký tự mở rộng có giá trị 128 and higher, bạn chỉ có thể gọi ord về đặc điểm cá nhân và xử lý những người có một giá trị> = 128. Sau đây đang đọc từ stdin và in chỉ các ký tự ASCII mở rộng:

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

Ngoài ra, cùng với unpackchr cũng sẽ làm việc. Ví dụ:

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

(Tôi chắc chắn một số guru Perl có thể ngưng tụ cả hai đến hai một lớp lót ...)


Để in số dòng thay vào đó, bạn có thể sử dụng sau đây (điều này không loại bỏ bản sao, và sẽ có hành vi kỳ quặc khi unicode được truyền):

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

(. Cảm ơn Yaakov Belch cho $. tip)

+0

Nó rất chậm và cách tiếp cận hiệu quả, xem giải pháp Dave Sherohman của http://stackoverflow.com/questions/881931/how-to-print-numbers-of-line-containing-extended-ascii-characters -in-perl/882113 # 882113 Nó nhanh hơn và đơn giản hơn nhiều. –

+0

Câu trả lời này đã được đăng trước khi Dave. Tôi đã thấy cách tiếp cận của Dave, và nó được ưa thích trong hầu hết các trường hợp. Điều này chỉ cho thấy rằng tôi là một người mới Perl. Tôi chọn không xóa câu trả lời này vì phần cuối cùng xuất hiện để làm chính xác những gì người hỏi muốn. Ngoài ra, hãy xem http://stackoverflow.com/questions/882122/reading-a-file-char-by-char-and-checking-for-extented-ascii-char – Stephan202

+0

... ah, trang đó đã bị xóa. Đủ để nói, câu hỏi đã nêu rằng số dòng cần được in cho * mỗi * ký tự ASCII mở rộng. Đây là giải pháp của tôi. – Stephan202

7

Ký tự ASCII có thể in đầu tiên là space (32). Ký tự ASCII có thể in lần cuối là ~ (126). Vì vậy, tôi có thể sử dụng

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

mặc dù nó sẽ thừa nhận, cũng hiển thị các dòng chứa ký tự điều khiển cũng như ASCII mở rộng.

Chỉnh sửa: Thay đổi để in số dòng chứ không phải chính dòng đó.

+1

Thật dễ dàng để in số dòng thay vì dòng: khi (<>) {in "$. \ N" nếu/[^ - ~] /;} Điều này sẽ giải quyết được vấn đề đã nêu –

+0

Rất tiếc! Tôi chỉ đọc câu hỏi và bỏ lỡ rằng tiêu đề đã chỉ định rằng anh ấy muốn số dòng. Cảm ơn cho bắt. –

5

oneliner:

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

cho các phiên bản perl cũ

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

Một câu hỏi quan trọng là liệu các byte sử dụng

;

pragma sẽ có hiệu lực. Người áp phích nên quyết định điều đó. Để chọn ký tự với các mã lớn hơn 127, sau đây là đủ:

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

hoặc

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

Hynek -Pichi- Vychodil của câu trả lời:

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

chỉ kiểm tra một phần hạn chế không in được có lẽ là

Thay vào đó,

.

1

Còn grep thì sao?

grep [\x00-\x1F\x7F-\xFF]+ * 
Các vấn đề liên quan