如何在perl

时间:2016-08-30 20:47:21

标签: arrays perl dataset

我试图将一大块文本中的特定变量放入单个数组中,例如原始数据:

dataset1
    <Time>08/30/2016 00:08:44.568</Time>
    <Tag>01234/<Tag>
    <Runs>2</Runs>
    <ID>A0 04 78 C1 02</ID>
    <Count>4</Count>
    <Kind>134</Kind>
enddataset1
dataset2
    <Time>08/30/2016 00:08:34.568</Time>
    <Tag>12345</Tag>
    <Runs>3</Runs>
    <ID>A0 04 78 C1 02</ID>
    <Count>1</Count>
    <Kind>140</Kind>
enddataset2

我想把它放到一个数组中

08/30/2016 00:08:44.568 \t 01234 \t 2 \t A0 04 78 C1 02 \t 4 \t 134
08/30/2016 00.08:34.568 \t 12345 \t 3 \t A0 04 78 C1 02 \t 1 \t 140

描述符(即时间,标签,运行等)是不变的,它们之间的值是可变的。

有关如何从内部拉动的知识吗?

3 个答案:

答案 0 :(得分:0)

如果您正在寻找快速而肮脏的解决方案,您可以执行以下操作:

while ($s=~/dataset\d*\s*(.*?)\s*end ?dataset\d*/gs) {
    my $r=$1;
    my @a=$r=~m{<\w+>(.*?)</\w+>}g;
    print join("\t",@a),"\n";
}

代码假定所有输入都存储在变量$s中(即在内存中)。您的格式略显不合适(例如enddataset1 vs end dataset),因此您可能需要稍微调整一下我的正则表达式。

答案 1 :(得分:0)

如果您的数据一致。这将有效。

use strict;
use warnings;

open(my $in,"<",$ARGV[0]) or die "File $ARGV[0] open error:$!\n";
my @in = <$in>;
close($in);

foreach my $in(@in) {
    chomp($in);
    if($in=~/enddataset/) {
        print "\n";
    }   
    elsif($in=~/dataset/) {
        #do nothing
    }   
    elsif ($in=~/<.*>(.*)<\/.*>/) {  #get data between tags
        print "$1\t";
    }   
}   

答案 2 :(得分:0)

  

我不鼓励这些类型的编码,除非暂时解决。

use strict;
use warnings;

my $inputfile = "input.txt";

open(IN, $inputfile) || die "Couldn't read..: $!..\n";
local $/; $_ = <IN>; my $temp = $_;
close(IN);

my @arrays = (); my $joinVals = "";
while($temp=~m/dataset(\d+)((?:(?!enddataset\1).)*)enddataset\1/sg)
{
    my $tags = $&;
    $tags=~s/<([a-z0-9\-\_]*)>((?:(?!<\/\1>).)*)<\/\1>/ $joinVals .= "$2\t";  ($&);/ieg;
    $joinVals .= "\n";
}

my @storearr = split /\n/i, $joinVals;
print join "\n", @storearr;
  

可能有人可以简化以上编码