提取数组后跟相应的匹配项

提取数组后跟相应的匹配项

我对 Perl 很陌生。我需要提取数组并在下面的列中打印。棘手的部分是每个单词都有不同的发音类型(在 P 或 S 中指定),并且每种类型都与其相应的发音和音节形状相关联。

我尝试使用数组[]来提取,但代码相当长。有没有更有效的编码方法?

输入(数据位于celex语料库中)。以下是数千行的一个示例。

31259\open\635\3\P\5-p@n\[VV][CVC]\[@U][p@n]\P\5-pH\[VV][CS]\[@U][pn,]\S\5-pF\[VV][CS]\[@U][pm,]
........
........

  我的输出需要如下所示:

WordForm   Frequency    Type      Pronunciation SyllableShape 

open         635       P.          [@U] [p@n]      [VV] [CVC]

open         635       P.          [@U] [pn,]          [VV] [CS] 

open         635       S           [@U] [pm,]          [VV] [CS] 

...

...

答案1

不确定如何确定.后面是否有 a P,但是假设这些都是 4 个元素组和 5 个元素标题,那么awk解决方案怎么样?

awk -F '\' 'BEGIN{ print "WordForm Frequency Type Pronunciation Syllableshape"}{
     for (i=5;i<=NF;i+=4) print $2, $3, $i, $(i+3), $(i+2)
}' file | column -t

输出

WordForm  Frequency  Type  Pronunciation  Syllableshape
open      635        P     [@U][p@n]      [VV][CVC]
open      635        P     [@U][pn,]      [VV][CS]
open      635        S     [@U][pm,]      [VV][CS]

编辑

根据下面的帖子,只是为了好玩(因为perl在昨晚之前我什至从未考虑过脚本编写目的),我已将上述循环敲入了一个perl似乎可以运行的脚本中。我确信下面的内容有很多错误,因为它是在没有知识的情况下从头开始拼凑的。因此,如果这是非常糟糕的编码,那么请不要发表评论或批评,只需发布​​正确的方法来为我的教育做这件事。

#!/bin/perl

open(my $filehandle, '<', './file')
    or die "Unable to open file, $!";
    print "WordForm  Frequency  Type  Pronunciation  Syllableshape\n";
    while (<$filehandle>) { 
        chomp($_);
        @c = split (/\\/, $_);
        for ($i=4;$i<=(@c-4);$i+=4) {
            print "@c[1] @c[2] @c[$i] @c[$i+3] @c[$i+2]\n";
        }
        print "\n";
    }
close($filehandle)
    or warn "Unable to close the file handle: $!";

答案2

我稍微简化了 perl 脚本。这个“脚本”可以用 来调用perl script file

print "WordForm Frequency  Type  Pronunciation  Syllableshape\n";
while (<>) {
        chomp;
        @c = split(/\\/);
        for ($i=4; $i<$#c; $i+=4) {
            print "$c[1] $c[2]";
            print " $c[$i] $c[$i+3] $c[$i+2]\n";
        }
}

$i<$#c;而不是$i<@c-4;:我遗漏了“安全性”减4(仅当记录被打破时才重要)。

$#c@c是作为标量值的数组,即最后一个索引。


与 awk () 的唯一区别i=5$i=4,因为第一个元素$c[0]在 perl 中。

相关内容