2015-04-01 24 views
0

我是perl的新手。我有一個要求,我必須將字符串中的UTF-8字符轉換爲連字符( - )。Perl - 將utf-8 char轉換爲連字符 - 將utf-8讀爲單個字符

Input string - "IVM IST 20150324095652 31610150096  10ÑatÑ25ÑDisco 0000000091" 
Expected output - "IVM IST 20150324095652 31610150096  10-at-25-Disco 0000000091". 

但以下方案,其中我已經寫,讀取UTF-8字符作爲兩個獨立的字節和得到的輸出爲 「10 - 在 - 25 - 迪斯科」

[[email protected] cdr]# cat ../asciifilter.pl 
#!/usr/bin/perl 
use strict; 
use Encode; 
my @chars; 
my $character; 
my $num; 
while(my $row = <>) { 
    @chars = split(//,$row); 

    foreach $character (@chars) { 
    $num = ord($character); 
    if($num < 127) { 
     print $character; 
    } else { 
     print "-"; 
    } 
    } 
} 

輸出:

[[email protected] cdr]# echo "IVM IST 20150324095652 31610150096  10ÑatÑ25ÑDisco 0000000091" | ../asciifilter.pl 
    IVM IST 20150324095652 31610150096  10--at--25--Disco 0000000091 

但這特定第四字符串列具有14個字符的固定長度only.So附加連字符正在創建的問題。

有人可以給我一些關於如何讀取UTF-8字符作爲單個字符的線索嗎?

+0

'使用開放「:STD」,':編碼(UTF-8) ;' – ikegami 2015-04-01 14:32:18

回答

2

你需要的主要東西是perl -CSD。就這樣,該腳本可以簡單到

perl -CSD -pe 's/[^\x00-\x7F]/-/g' 

man perlrun對這些選項的討論;但是簡要地說,-CS表示STDIN,STDOUTSTDERR是UTF-8;和-CD意味着UTF-8是輸入和輸出流的默認PerlIO層。 (此腳本只使用STDINSTDOUT所以D是不是絕對必要的,但如果你只學一個神奇的咒語,學習-CSD。)

+0

謝謝它的作品。你的一個班輪碼也是非常有用的。今天在Perl中學到的新東西:) – vijayashankard 2015-04-01 11:41:33

相關問題