配列を抽出し、対応する一致を抽出します。

配列を抽出し、対応する一致を抽出します。

私はPerlに初めて触れました。配列を抽出して下の列に印刷する必要があります。難しい部分は、各単語が異なるサウンドタイプ(PまたはSで指定)を持ち、各タイプが対応するサウンドと音節の形に関連付けられていることです。

array []を使って抽出してみましたが、コードはかなり長いです。これをエンコードするより効率的な方法はありますか?

入力(データはcelex corpusにあります)。以下は、数千行の例です。

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

.その背後にあるかどうかを確認する方法がわかりませんが、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: $!";

おすすめ記事