Perl - 将 utf-8 字符转换为连字符 - 将 utf-8 读取为单个字符

Perl - Convert utf-8 char to hyphen - read utf-8 as single char

我是 perl 新手。我有一个要求,我必须将字符串中的 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--at--25--Disco”

[root@ 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 "-";
    }
  }
}

输出:

  [root@MAVBGL-351L cdr]# echo "IVM IST   20150324095652 31610150096     10ÑatÑ25ÑDisco 0000000091" | ../asciifilter.pl
  IVM IST   20150324095652 31610150096     10--at--25--Disco 0000000091

但是这个特定的第 4 个字符串列的长度固定为 14 个字符only.So,额外的连字符会产生问题。

谁能给我一些关于如何将 UTF-8 字符读取为单个字符的线索?

你主要需要的是perl -CSD。这样,脚本就可以简单到

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

有关选项的讨论,请参阅 man perlrun;但简而言之,-CS 表示 STDINSTDOUTSTDERR 为 UTF-8; -CD 表示 UTF-8 是输入和输出流的默认 PerlIO 层。 (此脚本仅使用 STDINSTDOUT,因此 D 不是绝对必要的;但如果您只学习一种魔法咒语,请学习 -CSD。)