【发布时间】:2017-08-08 22:10:37
【问题描述】:
您好,我有一个包含以下键和值的数组:
atest, 2
ctest, 3
btest, 8
ftest, 1
gtest, 6
然后我将它们从一个文件解析成一个数组。现在我想每次都按该顺序返回它们,就像 CSV 一样。 但是我无法让它工作。
来源:
#!/usr/bin/env perl
use warnings;
use strict;
my @data;
my %tags;
my $cur_tag;
my ($tag,$line);
open (FILE, '<', $ARGV[0]) or die "Could not open file: $!";
while (<FILE>) {
chomp;
if (/^(MyValStart)/)
{ push @data, {} }
elsif ( ($tag,$line) = (/^\s*(atest)\s+(.+)$/)) {
$data[-1]{$tag} .= " NEWLINE " if exists $data[-1]{$tag};
$data[-1]{$tag} .= $line;
$tags{$tag}++;
$cur_tag = $tag;
}
elsif ( ($tag,$line) = (/^\s*(ctest)\S\s+(.+)$/)) {
$data[-1]{$tag} .= " NEWLINE " if exists $data[-1]{$tag};
#print ($line,"\n");
$data[-1]{$tag} .= $line;
$tags{$tag}++;
$cur_tag = $tag;
}
elsif ( ($tag,$line) = (/^\s*(itest)\S\s+(.+)$/)) {
$data[-1]{$tag} .= " NEWLINE " if exists $data[-1]{$tag};
$data[-1]{$tag} .= $line;
$tags{$tag}++;
$cur_tag = $tag;
}
elsif ( ($tag,$line) = (/^\s*(btest)\S\s+(.+)$/)) {
$data[-1]{$tag} .= " NEWLINE " if exists $data[-1]{$tag};
$data[-1]{$tag} .= $line;
$tags{$tag}++;
$cur_tag = $tag;
}
elsif ( ($tag,$line) = (/^\s*(ytest)\S\s+(.+)$/)) {
$data[-1]{$tag} .= " NEWLINE " if exists $data[-1]{$tag};
$data[-1]{$tag} .= $line;
$tags{$tag}++;
$cur_tag = $tag;
}
elsif ( ($tag,$line) = (/^\s*(ftest)\S\s+(.+)$/)) {
$data[-1]{$tag} .= " NEWLINE " if exists $data[-1]{$tag};
$data[-1]{$tag} .= $line;
$tags{$tag}++;
$cur_tag = $tag;
}
elsif ( ($tag,$line) = (/^\s*(gtest)\S\s+(.+)$/)) {
$data[-1]{$tag} .= " NEWLINE " if exists $data[-1]{$tag};
$data[-1]{$tag} .= $line;
$tags{$tag}++;
$cur_tag = $tag;
}
elsif ( ($tag,$line) = (/^\s*(utest)\S\s+(.+)$/)) {
$data[-1]{$tag} .= " NEWLINE " if exists $data[-1]{$tag};
$data[-1]{$tag} .= $line;
$tags{$tag}++;
$cur_tag = $tag;
}
elsif ($cur_tag) {
$data[-1]{$cur_tag} .= " NEWLINE ".$_;
}
}
use Text::CSV;
my $csv = Text::CSV->new({binary=>1,auto_diag=>2,eol=>"\n",
sep_char=>";",always_quote=>1,blank_is_undef=>1});
%tags=qw/atest ctest btest ftest gtest/;
$csv->print(select, [%tags]);
for my $row (@data) {
my @vals = map { $row->{$_} } %tags;
$csv->print(select, \@vals);
}
从源代码可见,还有一些我解析到数组中的东西后来不用于打印输出。 这两个问题我都解决不了。
我想要的输出只针对 atest、ctest、btest、ftest 和 gtest 的值,如
"2"; "3"; "8"; "1"; "6"
"1"; "5"; "2"; "0"; "5"
返回的数字也可以是多行的单词或句子,但这已经奏效了。
输入文件是这样的:
MyValStart
---------------
atest: 2
ctest: 3
itest: 3
btest: 8
ytest: 3
ftest: 1
gtest: 6
utest: 348385fhjdhgofdgkdfjgd
MyValStart
---------------
atest: 1
ctest: 5
itest: 3
btest: 2
ytest: jfdgdf ifdgijfdjgoksfk iosjfdjdisfpgj
ftest: 0
gtest: 5
utest: jfsdhgjfd fighfidhg ifhdghfid ifdhjgifdh
关于如何解决此问题以使其正常工作的任何想法?
提前致谢。
【问题讨论】:
-
您能否为所提供的输入示例提供相应的输出示例,因为不清楚您期望的输出是什么?
-
Re "我有一个包含以下键和值的数组:",这没有意义。数组键是数字。