我正在修改一個Perl腳本,它以製表符分隔的格式讀取一系列UCS-2LE編碼文件,但是當字符串包含擴展拉丁字符集之外的字符時,我無法分離製表符上的字符串。當字符串包含非拉丁字符時,在Perl中使用split()函數的問題Perl中的問題
下面是我從這些文件中讀取(製表符分隔)的樣本行:
adını transcript asr turkish
當我有我的劇本寫這幾行輸出文件,試圖調試這個問題,這是它正在寫的:
ad1Ů1ĉtranscript asr turkish
它似乎不識別土耳其字符後面的製表符。只有當單詞以非拉丁字符結尾時(以及與標籤相鄰),纔會發生這種情況。
下面是代碼塊的一部分,其中寫入到輸出文件中發生和串分解發生的情況:
for my $infile (@ARGV){
if (!open (INFILE, "<$infile")){
die "Couldn't open $infile.\n";
}
binmode (OUTFILE, ":utf8");
while (<INFILE>) {
chomp;
$tTot++;
if ($lineNo == 1) {
$_ = decode('UCS-2LE', $_);
}
else {
$_ = decode('UCS-2', $_);
}
$_ =~ s/[\r\n]+//g;
my @foo = split('\t');
my $orth = $foo[0];
my $tscrpt = $foo[1];
my $langCode = $foo[3];
if (exists $codeHash{$langCode}) {
unless ($tscrpt eq '') {
check($orth, $tscrpt, $langCode);
}
}
else {
print OUTFILE "Unknown language code $langCode at line $lineNo.\n";
print OUTFILE $_; # printing the string that's not being split correctly
print OUTFILE "\n";
$tBad++;
}
}
該腳本的目的是檢查的是,對於在輸入文件中的每一行,語言代碼是有效的,並根據該代碼根據我們的轉錄系統檢查每個單詞的轉錄是否爲「合法」。
這裏是我試過到目前爲止:
- 改變輸入字符串的編碼,因爲它們可以讀取到 UTF-8,UTF-16或UTF-16LE
- 更改分割()字符爲'\ w', /[[:blank:]] /,\ p {Blank},\ x {09}和\ N {U + 0009}。
- 閱讀的Perl 統一& perlrebackslash文檔和其他遠程 相關的帖子我已經能夠找到各種網站上
有沒有人有任何建議,其他的東西我可能會嘗試一下呢?提前致謝!
我還應該提到,我無法控制輸入文件編碼和輸出文件編碼;我必須讀取UCS-2LE並輸出UTF-8。
您應該能夠在5行以下的'split'中演示問題。並且不要忽略在更新中處理輸出編碼的行。另外,請提供即將到來的演示失敗的輸入。 'od -t x1 file'將以不會損壞的格式提供。 – ikegami
btw,'$ _ = decode('UCS-2LE',$ _); s/^ \ x {FEFF} //;'是解碼文件的一種更簡單的方法。更好的辦法是在'open'中使用'<:raw:encoding(UCS-2le):crlf''而不是''<'''。 – ikegami
您的'split'到'@ foo'似乎與您的輸出大部分無關,只是觸發了幾條錯誤消息。在's'聲明之下沒有任何東西似乎對您的(未編碼)'$ _'打印有任何影響。 – tjd