【问题标题】:Updating and creating new elements in a hash table在哈希表中更新和创建新元素
【发布时间】:2018-01-01 21:08:00
【问题描述】:

在我解析一个大的.sql 文件后,这是来自%hashtable 的打印输出:

Key:AS_LINR 

Value:
Name:DS_LSNE_DDD_TS_A

Type:view




Parents:DM_LINE_END MINA_TI_GRP_V

这是%hash

 $hashtable{$name}="Name:$name

Type:$type




Parents:@parents"."\n\n




".


"----------------------------"
;

我需要检查每个父母是否在 %hash 中以 key 的形式存在。如果他确实需要更新它并添加一个名为 children: 的新文件,我会将我第一次找到父级的名称作为值添加到字段 children 中。就像在这个例子中一样:

Key:DM_LINE_END 

Value:
Name:DS_LSNE_DDD_TS_A

Type:view
Children:AS_LINR

我需要为每个 Parent 执行此操作。我想通过向其中添加新元素来更新哈希,如果 has 的键不存在,我必须创建一个。 如果我必须更好地解释我必须做什么,请在 cmets 中询问。

这是我的 perl 代码:

my $var=0;
my @joinparents=();

use warnings;

my %hashtable;
open(DATA,'<','NaViews.sql') or die "Error $!";
open(Writer,'>','ResultFile.txt') or die "Error $!";
open(Writer1,'>','AuxResult.txt') or die "Error $!";

my @create_cmds = ();
my $create_cmd = "";
READ_DATA : while (<DATA>) {
    chop;
    my $ln = $_;

    $ln =~ s/^\s+//;
    $ln =~ s/\s+$//;
    next READ_DATA if($ln =~ /^\-\-/);
    next READ_DATA if($ln =~ /^REM/);

    if($create_cmd ne "") {
        $create_cmd = $create_cmd." ".$ln;
    }

    if($ln =~ /^create/i) {
        $create_cmd = $ln;
    }
    elsif($ln =~ /\;$/) {
        push @create_cmds, $create_cmd;
        $create_cmd = "";
    }
}

close DATA;

my @views = ();

foreach my $create_cmd (@create_cmds) {
    $create_cmd =~ s/\s+/ /;
    $create_cmd =~ s/^\s+//;
    $create_cmd =~ s/\s+$//;
    my $name = get_view($create_cmd);

    my $type = get_type($create_cmd);
    my $content = substr($create_cmd, 0, -1);
    my @parents =();#get_parents();
    my @children = ();#get_children();

#------------------------------------------------------------------------
    my @froms = split(/ from\s+/i, $create_cmd);
    my @joins = split(/ join /i, $create_cmd);

    #parcurge mai multe for in aceeasi structura
    #FOR FROM

        # body...

    foreach my $i (1..@froms-1) {
        #print Writer1 "$froms[$i]"."\n\n";

        my $from = (split(/ where |select | left |  left | right | as /i, $froms[$i])) [0];
        $from=~s/^\s+//;
        $from=~s/\(+//;


        my @Spaces = split(/, | , /,$from);
            foreach my $x (0..@Spaces-1) {
                my $SpaceFrom = (split(/ /,$Spaces[$x])) [0];
                $SpaceFrom=~s/;//;
                $SpaceFrom=~s/\)+//;
            #print Writer1 $SpaceFrom."\n\n";
                push(@parents,$SpaceFrom);

        #        print "\n\n".$SpaceFrom."\n\n";
        #        print Writer "\n\n".$SpaceFrom."\n\n";

            }
    foreach my $x (1..@joins-1){
        #print "$joins[$i]"."\n\n";

            my $join = (split(/ on /i,$joins[$x])) [0];
            my $joinspace = (split(/ /i,$joins[$x])) [0];
            #print Writer "\n\n".$join."\n\n";   
            #print Writer1 $joinspace."\n\n";
            #"$joinspace\n\n";
             push(@parents,$joinspace);

        print Writer1"\n\n".$parents[$_]."\n\n";

    }

        }

        push @views, [$name, $type, $content, @parents, @children];

        $hashtable{$name}="[0]Name:$name
[1]Type:$type


[2]Content:$content

[3]Parents:@parents"."\n\n




".


"----------------------------";


}


print Writer "Key:$_ 
Value:
$hashtable{$_}\n" foreach (keys%hashtable);

#------------------------------------------------------------------------------

print_views(\@views);


exit;



#------------------------------------------------------------------------------
sub get_view {
    my $create_cmd = $_[0];
    my $tmp = (split(/ view | trigger | table /i, $create_cmd))[1];
    $tmp =~ s/^\s+//;
    my $view = (split(/\s+/, $tmp))[0];
    return $view;
}
#-----------------------------------------------------------------------------
sub get_type{
    my $create_cmd = $_[0];
    my $tmp = (split(/ replace /i, $create_cmd))[1];
    $tmp =~ s/^\s+//;
    my $view = (split(/\s+/, $tmp))[0];
    return $view;
}
#-----------------------------------------------------------------------------
sub get_parents {

}
sub get_children {



    }



get_children();


close Writer1;
close Writer;

这就是我必须解析的一大块数据的样子:

create or replace view MINA_TI_GRP_V
as
select NVL(max(t1.interval_group),(select dm_group from sdate_dm_grp_v)) AS DM_GROUP,
  (t2.interval_number) INTERVAL_NUMBER ,  t2.time_interval_s
  from  MINA_INTERVAL_CONTROL t2
  left join DM_TI_GRP_DATE_TIME t1 on t2.time_interval_s >= t1.time_interval_s
  group by t2.interval_number ,  t2.time_interval_s
  order by t2.interval_number;

【问题讨论】:

  • 你的代码在哪里?
  • 你的 Perl 代码在哪里?我们需要在问题中添加minimal reproducible example,以便我们知道您要做什么
  • 我向您询问了 perl 代码并且,编辑您的问题,而不是将一些代码放入 cmets。不可读。

标签: regex perl hash


【解决方案1】:

如果您想轻松找出 %hashtable 中条目的父项是什么,您会发现将数据存储为另一个散列而不是像这样的巨大字符串会容易得多...

$hashtable{$name}={"Name" => $name, "Type" => $type, "Parents" => \@Parent};

然后,您可以引用 $hashtable{$key}-&gt;{"Parents"} 来获取包含该数据条目的父项的数组 ref,您可以像这样使用它...

foreach my $parent (@{$hashtable{$key}->{"Parents"}})
  {
  if(defined($hashtable{$parent}))
    {
    # Parent exists in hashtable
    }
  else
    {
    # Parent does not exist in hashtable
    }
  }

【讨论】:

    猜你喜欢
    • 2018-10-12
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多