perl打印格式错误

时间:2016-04-19 12:50:16

标签: perl

我有一个perl代码段来从输入文本生成解析树,但它产生错误格式化的解析树。我需要根据数量生成( )S括号 后缀和前缀和词干。

代码和GT;

use strict;
use warnings qw/ all FATAL /;
use List::Util 'reduce';

# our ($a, $b);

while ( <> ) {
    chomp;
    my ($word, $ss) = split ' ', $_, 2;   
    my @ss = split /\s/, $ss;

    my $str = reduce { sprintf 'S (%s) (%s)', $a, $b } @ss;

    printf "%s (%s)\n", $word, $str;
}

输入

 (অংশগ্রহণও)      (অংশ:stem গ্রহণ:suffix ও:suffix ) 
 (অংশজুড়েই)   (অংশ:stem জুড়ে:suffix ই:suffix ) 
 (অংশত্ব)     (অংশ:stem ত্ব:suffix ) 
 (অংশসহ)      (অংশ:stem সহ:suffix ) 
 (অংশীদারত্বে)    (অংশ:stem ী:suffix দার:suffix ত্ব:suffix ে:suffix ) 
 (অকল্পনীয়)   (অ:prefix কল্প:suffix নীয়:suffix ) 
 (অকাণ্ড)     (অ:prefix কাণ্ড:suffix ) 
 (অক্টোবর)    (অক্টোবর) 
 (অক্টোবরে)   (অক্টোবর:stem ে:suffix ) 
 (অখাদ্যে)    (অ:prefix খাদ্য:suffix ে:suffix ) 
 (অগণিত)      (অ:prefix গণিত:suffix ) 
 (অগ্নিগোলা)      (অগ্নি:stem গোলা:suffix ) 
 (অগ্নিনির্বাপণের)    (অগ্নি:stem নির্বাপণ:suffix ের:suffix ) 
 (অগ্নিপরীক্ষা)   (অগ্নি:stem পরীক্ষা:suffix ) 
 (অগ্নিসংযোগসহ)   (অগ্নি:stem সংযোগ:suffix সহ:suffix ) 

预期输出&gt;

অগ্নিসংযোগসহ      (S(S(অগ্নি:stem) (সংযোগ:suffix)) (সহ:suffix )) 

它会产生错误的输出。在生成的输出中,您可以看到许多错误,例如:()

 (অংশ) ((অংশ))
    (অংশগ্রহণও) (S (S (S ((অংশ:stem) (গ্রহণ:suffix)) (ও:suffix)) ()))
    (অংশজুড়েই) (S (S (S ((অংশ:stem) (জুড়ে:suffix)) (ই:suffix)) ()))
    (অংশত্ব) (S (S ((অংশ:stem) (ত্ব:suffix)) ()))
    (অংশসহ) (S (S ((অংশ:stem) (সহ:suffix)) ()))
    (অংশীদারত্বে) (S (S (S (S (S ((অংশ:stem) (ী:suffix)) (দার:suffix)) (ত্ব:suffix)) (ে:suffix)) ()))
    (অকল্পনীয়) (S (S (S ((অ:prefix) (কল্প:suffix)) (নীয়:suffix)) ()))
    (অকাণ্ড) (S (S ((অ:prefix) (কাণ্ড:suffix)) ()))
    (অক্টোবর) ((অক্টোবর))
    (অক্টোবরে) (S (S ((অক্টোবর:stem) (ে:suffix)) ()))
    (অখাদ্যে) (S (S (S ((অ:prefix) (খাদ্য:suffix)) (ে:suffix)) ()))
    (অগণিত) (S (S ((অ:prefix) (গণিত:suffix)) ()))

如何以预期格式生成结果?

1 个答案:

答案 0 :(得分:1)

我认为你错误地分割了原始行。我知道一点孟加拉语,但我不知道你正在处理的文件的语法

我认为这就像从源数据中提取所有括号分隔的子串一样简单,就像这样

use strict;
use warnings 'all';

use List::Util 'reduce';

while ( <> ) {

    my ($word, $ss) = / \( ( [^()]* ) \) /gx;

    my @ss = split ' ', $ss;

    my $str = reduce { sprintf 'S (%s) (%s)', $a, $b } @ss;

    printf "%s (%s)\n", $word, $str;
}

输出

অংশগ্রহণও (S (S (অংশ:stem) (গ্রহণ:suffix)) (ও:suffix))
অংশজুড়েই (S (S (অংশ:stem) (জুড়ে:suffix)) (ই:suffix))
অংশত্ব (S (অংশ:stem) (ত্ব:suffix))
অংশসহ (S (অংশ:stem) (সহ:suffix))
অংশীদারত্বে (S (S (S (S (অংশ:stem) (ী:suffix)) (দার:suffix)) (ত্ব:suffix)) (ে:suffix))
অকল্পনীয় (S (S (অ:prefix) (কল্প:suffix)) (নীয়:suffix))
অকাণ্ড (S (অ:prefix) (কাণ্ড:suffix))
অক্টোবর (অক্টোবর)
অক্টোবরে (S (অক্টোবর:stem) (ে:suffix))
অখাদ্যে (S (S (অ:prefix) (খাদ্য:suffix)) (ে:suffix))
অগণিত (S (অ:prefix) (গণিত:suffix))
অগ্নিগোলা (S (অগ্নি:stem) (গোলা:suffix))
অগ্নিনির্বাপণের (S (S (অগ্নি:stem) (নির্বাপণ:suffix)) (ের:suffix))
অগ্নিপরীক্ষা (S (অগ্নি:stem) (পরীক্ষা:suffix))
অগ্নিসংযোগসহ (S (S (অগ্নি:stem) (সংযোগ:suffix)) (সহ:suffix))