检查平衡字符不起作用

时间:2012-07-02 19:30:57

标签: linux perl text

我想写一个perl脚本来检查某些字符是否在字符串中是平衡的。如果他们不平衡,它会删除它们。 例如,如果字符串仅包含左括号,则必须删除此字符。我使用了以下代码,但它不起作用......

sub checkBalance{
    my $text= $_[0];
    ### Check Balanced Quates
    my $count = ($text =~ tr/"//);
    if ( $count%2 !=0)
    {
      $text=~ s/"//g;
    }
    ### Check Balanced «»
    if (((($text =~ m#(.*».*)#) && !($text =~ m#(.*«.*)#)) || !(($text =~ m#(.*».*)#) && ($text =~ m#(.*«.*)#))) || (index($text, "«")>index($text, "»")))
    {
      $text=~ s/»//g;
      $text=~ s/«//g;
    }
    return $text;
} 

为什么它不起作用?

pl文件是UTF8。样本输入是:

 می گوید: «یکی از اصول

和预期的输出是:

 می گوید: یکی از اصول

我在英文字符串上使用此代码,似乎它适用于英文字符串,但不适用于其他语言,如阿拉伯语和波斯语。

2 个答案:

答案 0 :(得分:3)

添加缺失的位:

use utf8;                               # Tell Perl script is encoded using UTF-8.
use strict;
use warnings;
use open ':std', ':encoding(UTF-8)';    # Tell Perl terminal expects UTF-8.
use feature qw( say );

sub checkBalance{
   ...
}

my $in = " می گوید: «یکی از اصول";
my $expect = " می گوید: یکی از اصول";
my $got = checkBalance($in);

say $in;
say $expect;
say $got;
say $got eq $expect ? "Got expected output" : "Didn't get expected output.";

我得到了正确的输出:

$ perl x.pl
 می گوید: «یکی از اصول
 می گوید: یکی از اصول
 می گوید: یکی از اصول
Got expected output

我怀疑你没告诉Perl你的源文件是用UTF-8编码的。添加use utf8;

将来,请提供问题演示。简单地发布您的功能并不能证明问题。

答案 1 :(得分:1)

如果您不想自己动手,可以使用Text::Balanced来处理在文本中查找平衡分隔符的问题。