我想写一个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。样本输入是:
می گوید: «یکی از اصول
和预期的输出是:
می گوید: یکی از اصول
我在英文字符串上使用此代码,似乎它适用于英文字符串,但不适用于其他语言,如阿拉伯语和波斯语。
答案 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来处理在文本中查找平衡分隔符的问题。