代码之家  ›  专栏  ›  技术社区  ›  singingfish

Perl中基于Unicode的tweet压缩器

  •  3
  • singingfish  · 技术社区  · 14 年前

    我想实现我自己的 tweet compressor

    这是我的剧本:

    #!/usr/bin/env perl
    use warnings;
    use strict;
    
    print tweet_compress('cc ms ns ps in ls fi fl ffl ffi iv ix vi oy ii xi nj/, "\. " ,", "'),"\n";
    
    sub tweet_compress {
        my $tweet = shift;
        $tweet =~ s/\. ?$//;
        my @orig = ( qw/cc ms ns ps in ls fi fl ffl ffi iv ix vi oy ii xi nj/, ". " ,", ");
        my @new = qw/㏄ ㎳ ㎱ ㎰ ㏌ ʪ fi fl ffl ffi ⅳ ⅸ ⅵ ѹ ⅱ ⅺ nj . ,/;
        $tweet =~ s/$orig[$_]/$new[$_]/g for 0 .. $#orig;
        return $tweet;
    }
    

    但这会在终端打印垃圾:

    ?.?.?.?.?.?.?.f.?.f?.?.?.?.?.?.?.nj/."\..,"."
    

    我做错什么了?

    2 回复  |  直到 14 年前
        1
  •  6
  •   deepakg    14 年前

    两个问题。

    使用use utf8 pragma。

    另外,如果您打算从控制台运行此程序,请确保它可以处理unicode。Windows命令提示符不能也将始终显示?不管你的数据是否正确。我在macos上运行了这个,终端设置为处理utf8。

    其次,如果您的原始列表中有“.”,它将被解释为“任何单个字符”,并给出错误的结果-因此您需要在正则表达式中使用它之前对其进行转义。我对程序做了一点修改,使它能工作。

    #!/usr/bin/env perl
    use warnings;
    use strict;
    use utf8; #use character semantics
    
    #make sure the data is re-encoded to utf8 when output to terminal
    binmode STDOUT, ':utf8';
    
    print tweet_compress('cc ms ns ps in ls fi fl ffl ffi iv ix vi oy ii xi nj/, "\. " ,", "'),"\n";
    
    sub tweet_compress {
        my $tweet = shift;
        $tweet =~ s/\. ?$//;
        my @orig = ( qw/cc ms ns ps in ls fi fl ffl ffi iv ix vi oy ii xi nj/, '\. ' ,", ");
        my @new = qw/㏄ ㎳ ㎱ ㎰ ㏌ ʪ fi fl ffl ffi ⅳ ⅸ ⅵ ѹ ⅱ ⅺ nj . ,/;
        $tweet =~ s/$orig[$_]/$new[$_]/g for 0 .. $#orig;
        return $tweet;
    }
    
        2
  •  1
  •   Pedro Silva    14 年前

    告诉 perl 你是 using unicode characters in your script 具有 use utf8 .