1

いくつかの文字が文字列内でバランスが取れているかどうかをチェックするための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です。サンプル入力は次のとおりです。

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

期待される出力は次のとおりです。

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

このコードを英語の文字列で使用しました。英語の文字列では機能するようですが、アラビア語やペルシア語などの他の言語では機能しないようです。

4

2 に答える 2

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

ソースファイルがUTF-8を使用してエンコードされていることをPerlに伝えていないのではないかと思います。追加しuse utf8;ます。

今後、問題点のデモンストレーションをお願いします。関数を投稿するだけでは、問題は発生しません。

于 2012-07-02T20:42:30.327 に答える
1

自分でロールしたくない場合は、Text :: Balancedを使用して、テキスト内のバランスの取れた区切り文字を見つける問題を処理します。

于 2012-07-02T20:50:19.547 に答える