我对 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 中。