Arrays Perl脚本中的Nee help@array

Arrays Perl脚本中的Nee help@array,arrays,perl,file,Arrays,Perl,File,我需要一些关于perl脚本的帮助 我有以下文件“etichete”: 我需要使用“etichete”创建“etichete.rttm”文件,如下所示: SPKR-INFO etichete 1 <NA> <NA> <NA> unknown speech_L1 <NA> SPKR-INFO etichete 1 <NA> <NA> <NA> unknown speech_L2 <NA> SPKR-INF

我需要一些关于perl脚本的帮助

我有以下文件“etichete”:

我需要使用“etichete”创建“etichete.rttm”文件,如下所示:

SPKR-INFO etichete 1 <NA> <NA> <NA> unknown speech_L1 <NA>
SPKR-INFO etichete 1 <NA> <NA> <NA> unknown speech_L2 <NA>
SPKR-INFO etichete 1 <NA> <NA> <NA> unknown speech_L3 <NA>
SPEAKER etichete 1 0.000 8.556 <NA> <NA> speech_L1 <NA>
SPEAKER etichete 1 8.556 21.063 <NA> <NA> speech_L2 <NA>
SPEAKER etichete 1 32.304 9.515 <NA> <NA> speech_L3 <NA>
SPEAKER etichete 1 42.049 0.767 <NA> <NA> speech_L1 <NA>

您的示例代码不会生成您显示的输出。您可能已将
$\uuu
更改为
$-

原因是
@rttm
是一个数组数组。不能直接打印数组引用以获取内部数组,必须先取消引用它:

print $fh1 "@$_\n";

顺便说一句,当您
使用autodie
时,无需在
打开后添加
或die
,此替代程序可能会对您有所帮助

据我所知,您需要的是每个标有
SPKR-INFO
的唯一扬声器的输出记录,然后是标有
speaker
的原始行的重新格式化版本

您显示的输入数据似乎与所需的输出不一致。下面我的程序使用这个输入

 0.000  8.556 speech_L1
 8.556 21.063 speech_L2
32.304  9.515 speech_L3
42.049  0.767 speech_L1
最大的变化是我已经放弃了
@rttm
数组,因为从表面上看,您可以在处理输出文件时将每一行打印到输出文件中

我还删除了遍历数组索引的笨拙的
while
循环。因为除了访问数组元素之外,不需要索引的值,所以直接对数组值进行交互更简单、更清晰

另外请注意,如果您有
autodie
,则无需使用
或die…
测试
open
调用是否成功

由于您包含了
List::MoreUtils
模块,因此我使用了
uniq
函数,而不是使用
@uniq
数组对其进行编码

use strict;
use warnings;
use autodie;

use List::MoreUtils qw(uniq);

open my $fh, '<', 'etichete';

my $nume = 'etichete';

my @file;
while (<$fh>) {
  push @file, [ split ];
}

my @unique_speakers = sort { $a cmp $b } uniq map $_->[2], @file;

open my $out, '>', 'etichete.rttm';

for my $speaker (@unique_speakers) {
  print $out join(' ', 'SPKR-INFO', $nume, '1', '<NA>', '<NA>', '<NA>', 'unknown', $speaker, '<NA>'), "\n";
}

for my $line (@file) {
  print $out join(' ', 'SPEAKER', $nume, '1', $line->[0], $line->[1], '<NA>', '<NA>', $line->[2], '<NA>'), "\n";
}

close $out;
使用严格;
使用警告;
使用自动模具;
使用列表::MoreUtils qw(uniq);
打开我的$fh,,'etichete.rttm';
对于我的$speaker(@unique_speaker){
打印$out join(''SPKR-INFO','nume','1','','',''unknown','speaker','),“\n”;
}
对于我的$line(@file){
打印$out join(“”,'SPEAKER',$nume,'1',$line->[0],$line->[1],“”,,$line->[2],“”),“\n”;
}
收尾美元;
输出

SPKR-INFO etichete 1 <NA> <NA> <NA> unknown speech_L1 <NA>
SPKR-INFO etichete 1 <NA> <NA> <NA> unknown speech_L2 <NA>
SPKR-INFO etichete 1 <NA> <NA> <NA> unknown speech_L3 <NA>
SPEAKER etichete 1 0.000 8.556 <NA> <NA> speech_L1 <NA>
SPEAKER etichete 1 8.556 21.063 <NA> <NA> speech_L2 <NA>
SPEAKER etichete 1 32.304 9.515 <NA> <NA> speech_L3 <NA>
SPEAKER etichete 1 42.049 0.767 <NA> <NA> speech_L1 <NA>
SPKR-INFO-etichete 1未知语音
SPKR-INFO etichete 1未知语音\u L2
SPKR-INFO etichete 1未知语音\u L3
演讲者etichete 1 0.000 8.556演讲
演讲者etichete 1 8.556 21.063演讲
演讲者etichete 1 32.304 9.515演讲3
演讲者etichete 1 42.049 0.767演讲

我不明白您想如何将输入转换为输出
 0.000  8.556 speech_L1
 8.556 21.063 speech_L2
32.304  9.515 speech_L3
42.049  0.767 speech_L1
use strict;
use warnings;
use autodie;

use List::MoreUtils qw(uniq);

open my $fh, '<', 'etichete';

my $nume = 'etichete';

my @file;
while (<$fh>) {
  push @file, [ split ];
}

my @unique_speakers = sort { $a cmp $b } uniq map $_->[2], @file;

open my $out, '>', 'etichete.rttm';

for my $speaker (@unique_speakers) {
  print $out join(' ', 'SPKR-INFO', $nume, '1', '<NA>', '<NA>', '<NA>', 'unknown', $speaker, '<NA>'), "\n";
}

for my $line (@file) {
  print $out join(' ', 'SPEAKER', $nume, '1', $line->[0], $line->[1], '<NA>', '<NA>', $line->[2], '<NA>'), "\n";
}

close $out;
SPKR-INFO etichete 1 <NA> <NA> <NA> unknown speech_L1 <NA>
SPKR-INFO etichete 1 <NA> <NA> <NA> unknown speech_L2 <NA>
SPKR-INFO etichete 1 <NA> <NA> <NA> unknown speech_L3 <NA>
SPEAKER etichete 1 0.000 8.556 <NA> <NA> speech_L1 <NA>
SPEAKER etichete 1 8.556 21.063 <NA> <NA> speech_L2 <NA>
SPEAKER etichete 1 32.304 9.515 <NA> <NA> speech_L3 <NA>
SPEAKER etichete 1 42.049 0.767 <NA> <NA> speech_L1 <NA>