免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 7692 | 回复: 33
打印 上一主题 下一主题

各位大虾,小弟又遇难处啦 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-09 10:58 |只看该作者 |倒序浏览
          ABC =  A1_B1;
          ABD =  C1_D1;
          A1    =  D0_A0;
          B1    =  A1_ABD;
          C1    =  C0;
          D1    =  B0_C1;

这里的"*0"为原始变量。现在想将上面的变量进行处理变成:
       ABC = D0_A0_D0_A0_C0_B0_C0;
          ABD =  C0_B0_C0;
          A1    =  D0_A0;
          B1    =  D0_A0_C0_B0_C0;
          C1    =  C0;
          D1    =  B0_C0;
想建立一个函数不知怎么写啊,希望各位大虾不吝指教。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
2 [报告]
发表于 2014-04-09 11:43 |只看该作者
呵呵,这个好,看样楼主对语法解析感兴趣啊,建议学 Lisp 吧

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [报告]
发表于 2014-04-09 11:53 |只看该作者
本帖最后由 jason680 于 2014-04-09 13:43 编辑

回复 1# yuanquan08



$ perl get_init.pl
ABC = D0_A0_D0_A0_C0_B0_C0;
ABD = C0_B0_C0;
A1 = D0_A0;
B1 = D0_A0_C0_B0_C0;
C1 = C0;
D1 = B0_C0;

$ cat get_init.pl
#!/usr/bin/perl
use strict;
use warnings;


my %hInit;
my @aInit;
while(<DATA>){
  chomp;
  s/\s*;\s*$//;
  my($sKey,@aData) = split /\s*[=_]\s*/;
  $hInit{$sKey} = join " ",@aData;
  push @aInit, $sKey;
}

sub get_init{
  my ($sKey) = @_;
  return $sKey if(!exists $hInit{$sKey});
  while($hInit{$sKey} =~ m/\b(\w+[^0 ])\b/){
    $hInit{$sKey} =~ s/\b(\w+[^0 ])\b/get_init($1)/ge;
  }  
  return $hInit{$sKey};
}
foreach my $sKey(keys %hInit){
  $hInit{$sKey} = get_init($sKey);
}
foreach (@aInit){
   $hInit{$_} =~ s/ /_/g;
   print "$_ = $hInit{$_};\n";
}
__DATA__
ABC =  A1_B1;
ABD =  C1_D1;
A1    =  D0_A0;
B1    =  A1_ABD;
C1    =  C0;
D1    =  B0_C1;

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2014-04-09 13:30 |只看该作者
这么长时间了,这楼主发帖的水平还是一如既往的烂啊。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
5 [报告]
发表于 2014-04-09 14:15 |只看该作者
回复 4# MMMIX


    他的问题都涉及到语言的解析,这是非常底层的技术,他如果持续对这方面的东西有兴趣,一定会走的很远。

论坛徽章:
0
6 [报告]
发表于 2014-04-09 14:35 |只看该作者
回复 3# jason680


    感谢您每次热情的帮助,针对您的回复,我如果不限制"*0"为原始变量,直到不能替换为之,那该怎么改呢?

论坛徽章:
0
7 [报告]
发表于 2014-04-09 14:35 |只看该作者
回复 5# 104359176


    谢谢楼上的理解。
   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
8 [报告]
发表于 2014-04-09 14:53 |只看该作者
回复 6# yuanquan08

sub get_init{
  my ($sKey) = @_;
  return $sKey if(!exists $hInit{$sKey});
  my $sRet = "";
  foreach(split /\s+/, $hInit{$sKey}){
    $sRet .= " " . get_init($_);
  }
  $sRet =~ s/^\s+//;
  $hInit{$sKey} = $sRet;  
}
foreach my $sKey(keys %hInit){
  get_init($sKey);
}
   

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
9 [报告]
发表于 2014-04-09 15:30 |只看该作者
典型的符号表运算
  1. #!perl

  2. use 5.016;

  3. my $text = <<EOF;
  4. ABC =  A1_B1;
  5. ABD =  C1_D1;
  6. A1  =  D0_A0;
  7. B1  =  A1_ABD;
  8. C1  =  C0;
  9. D1  =  B0_C1;
  10. EOF

  11. compute($text);

  12. sub compute {
  13.     my $text = shift;
  14.     my @lines = split /\n/, $text;
  15.     my $data = {};
  16.     foreach my $line (@lines) {
  17.         my ($key, @keys) = $line =~ /[A-Z0-9]+/g;
  18.         # 取第一个元素为查询键 其他元素为值
  19.         $data->{ $key } = [ @keys ];
  20.     }
  21.     $data = replace_recur($data);
  22.     output($data)
  23. }

  24. sub replace_recur {
  25.     my $data = shift;
  26.     foreach my $key (keys $data) {
  27.         my $over_flag = 0;
  28.         # 防止出现循环嵌套,进入死循环
  29.         LOOP:
  30.         foreach (1 .. 10) {
  31.             my $value = $data->{$key};
  32.             my @new_value = ();
  33.             foreach my $element (@{$value}) {
  34.                 if (exists $data->{$element}) {
  35.                     @new_value = (@new_value, @{ $data->{$element} });
  36.                     $over_flag++;
  37.                 } else {
  38.                     push @new_value, $element;
  39.                 }
  40.             }
  41.             $data->{$key} = [ @new_value ];
  42.             # 如果没有替换行为就终止循环
  43.             last LOOP if ($over_flag == 0);
  44.             $over_flag = 0;
  45.         }
  46.     }
  47.     return $data;
  48. }

  49. sub output {
  50.     my $data = shift;
  51.     while (my ($key, $value) = each %{$data}) {
  52.         my $value_str = join '_', @{$value};
  53.         say "$key = $value_str;";
  54.     }
  55. }
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
10 [报告]
发表于 2014-04-09 16:15 |只看该作者
回复 1# yuanquan08
  1. cat cu.pl

  2. #!/usr/bin/env perl

  3. use strict;
  4. use Data::Dumper;
  5. my %h;
  6. while(<DATA>){
  7.         s/;//g;
  8.         /([\S]+)\s+=\s+(.*)/;
  9.         my $key = $1;
  10.         my @value = split /_/,$2;
  11.         map{push @{$h{$key}},$_}@value;
  12. }
  13. my $key = shift;
  14. print $key," = ";
  15. my $value;
  16. re($key);
  17. $value =~ s/_$/;/;
  18. print $value,"\n";

  19. sub re{
  20.                my $key = shift;
  21.         if ($key =~ /0$/){
  22.                 $value .= $key."_";
  23.         }else{
  24.                       re($_) for @{$h{$key}};
  25.         }
  26. }

  27. __DATA__
  28. ABC =  A1_B1;
  29. ABD =  C1_D1;
  30. A1    =  D0_A0;
  31. B1    =  A1_ABD;
  32. C1    =  C0;
  33. D1    =  B0_C1;
复制代码
  1. perl cu.pl ABC
  2. ABC = D0_A0_D0_A0_C0_B0_C0;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP