Arrays Perl脚本中的Nee help@array
我需要一些关于perl脚本的帮助 我有以下文件“etichete”: 我需要使用“etichete”创建“etichete.rttm”文件,如下所示: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
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>