免费注册 查看新帖 |

Chinaunix

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

找不到错误了??? [复制链接]

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-10-26 21:35 |只看该作者 |倒序浏览
看了篇帖子, 内容如下:
我现在有三个文件,省、市、县各有一个文件分别为:
sheng.txt
1 北京市
2 天津市
3 河北省
4 山西省
5 内蒙古自治区
6 辽宁省
7 吉林省
8 黑龙江省

shi.txt
1 北京市 1
2 天津市 2
3 石家庄市 3
4 唐山市 3
5 秦皇岛市 3
6 邯郸市 3
7 邢台市 3
8 保定市 3
9 张家口市 3
10 承德市 3

xian.txt
1 东城区 1
2 西城区 1
3 崇文区 1
4 宣武区 1
5 朝阳区 1
6 丰台区 1
7 石景山区 1
8 海淀区 1
9 门头沟区 1
10 房山区 1

怎么样处理这3个文件最后形成一个文件:
1,北京市,北京市,北京市
2,北京市,北京市,东城区
3,北京市,北京市,西城区
……
N,河北省,石家庄市,石家庄市
……
M,河北省,保定市,保定市
……

最后的文件格式就是序号,省,市,县。省的话就是序号,省,省,省;市的话就是序号,省,市,市;县区的话就是序号,省,市,县区。
这个序号就是1往后递增。


补充说明下:省市县的三个文件没有完全列出来,格式是保持一致的。市的第三段对应的就是省的序号,县市的第三段对应的就是市的序号




代码如下:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. sub Load{
  5.     local @ARGV = shift;
  6.     my $rh = shift;
  7.     while (<>){
  8.         my ($num, $name) = split;
  9.         $rh->{$num} = $name;
  10.     }
  11. }

  12. sub Load1{
  13.     local @ARGV = shift;
  14.     my $rh = shift;
  15.     while (<>){
  16.         my ($num, $name, $id) = split;
  17.         push (@{$rh->{$id}}, [$num, $name]);
  18.     }
  19. }

  20. my ($rhReg, $rhCity, $rhCom) = ({}, {}, {});
  21. Load (shift, $rhReg);
  22. Load1 (shift, $rhCity);
  23. Load1 (shift, $rhCom);

  24. foreach my $rNum (sort keys %$rhReg){
  25.     my $rName = $rhReg->{$rNum};
  26.     my @aCity = @{$rhCity->{$rNum}};
  27.     if (!@aCity){
  28.         print join (', ', $rNum, ($rName) x 3), "\n";
  29.         next;
  30.     }
  31.     foreach my $raCity (@aCity){
  32.         my ($cNum, $cName) = @$raCity;
  33.         my @aCom = @{$rhCom->{$cNum}};
  34.         if (!@aCom){
  35.             print join (', ', $rNum, $rName, ($cName) x 2), "\n";
  36.             next;
  37.         }
  38.         foreach my $raCom (@aCom){
  39.             my $com = $raCom->[-1];
  40.             print join (', ', $rNum, $rName, $cName, $com), "\n";
  41.         }
  42.     }
  43. }

复制代码
总是报错, "Can't use an undefined value as an ARRAY reference".
找了半天还是未将问题定位到, 还请大家指点. 谢谢大家...

论坛徽章:
0
2 [报告]
发表于 2016-10-26 22:26 |只看该作者
my @aCity = @{$rhCity->{$rNum}}; 改为 my @aCity = $rhCity->{$rNum} ? @{$rhCity->{$rNum}});
my @aCom = @{$rhCom->{$cNum}};改为my @aCom = $rhCom->{$cNum} ? @{$rhCom->{$cNum}}: ();

类似于
my $aa = undef;
print @$aa;

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 很给力!

查看全部评分

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
3 [报告]
发表于 2016-10-27 09:18 |只看该作者
回复 2# fcl21721
多谢大师指点, 非常感谢!

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
4 [报告]
发表于 2016-10-27 09:22 |只看该作者
最终代码如下:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. sub Load{
  5.     local @ARGV = shift;
  6.     my $rh = shift;
  7.     while (<>){
  8.         my ($num, $name) = split;
  9.         $rh->{$num} = $name;
  10.     }
  11. }

  12. sub Load1{
  13.     local @ARGV = shift;
  14.     my $rh = shift;
  15.     while (<>){
  16.         my ($num, $name, $id) = split;
  17.         push (@{$rh->{$id}}, [$num, $name]);
  18.     }
  19. }

  20. my ($rhReg, $rhCity, $rhCom) = ({}, {}, {});
  21. Load (shift, $rhReg);
  22. Load1 (shift, $rhCity);
  23. Load1 (shift, $rhCom);

  24. foreach my $rNum (sort keys %$rhReg){
  25.     my $rName = $rhReg->{$rNum};
  26.     my @aCity = $rhCity->{$rNum} ? @{$rhCity->{$rNum}} : ();
  27.     if (!@aCity){
  28.         print join (', ', $rNum, ($rName) x 3), "\n";
  29.         next;
  30.     }
  31.     foreach my $raCity (@aCity){
  32.         my ($cNum, $cName) = @$raCity;
  33.         my @aCom = $rhCom->{$cNum} ? @{$rhCom->{$cNum}} : ();
  34.         if (!@aCom){
  35.             print join (', ', $rNum, $rName, ($cName) x 2), "\n";
  36.             next;
  37.         }
  38.         foreach my $raCom (@aCom){
  39.             my $com = $raCom->[-1];
  40.             print join (', ', $rNum, $rName, $cName, $com), "\n";
  41.         }
  42.     }
  43. }
复制代码


最后我想请教下大家, 像这种问题 还有其他解决思路吗?

论坛徽章:
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
5 [报告]
发表于 2016-10-27 09:33 |只看该作者
回复 4# sunzhiguolu

1. 打印少了...

2. http://bbs.chinaunix.net/thread-4255399-1-1.html

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 很给力!

查看全部评分

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
6 [报告]
发表于 2016-10-27 10:08 |只看该作者
最近学习 go 语言,习惯所有的变量都先声明变量类型,然后赋值。
竟然发现 Perl 程序越来越看不懂了。

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
7 [报告]
发表于 2016-10-27 10:17 |只看该作者
本帖最后由 sunzhiguolu 于 2016-10-27 10:22 编辑

回复 5# jason680
谢谢大神指点, 您提醒的太对了. 我太马虎了。
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. sub Load{
  5.     local @ARGV = shift;
  6.     my $rh = shift;
  7.     while (<>){
  8.         my ($num, $name) = split;
  9.         $rh->{$num} = $name;
  10.     }
  11. }

  12. sub Load1{
  13.     local @ARGV = shift;
  14.     my $rh = shift;
  15.     while (<>){
  16.         my ($num, $name, $id) = split;
  17.         push (@{$rh->{$id}}, [$num, $name]);
  18.     }
  19. }

  20. my ($rhReg, $rhCity, $rhCom) = ({}, {}, {});
  21. Load (shift, $rhReg);
  22. Load1 (shift, $rhCity);
  23. Load1 (shift, $rhCom);

  24. foreach my $rNum (sort keys %$rhReg){
  25.     my $rName = $rhReg->{$rNum};
  26.     my @aCity = $rhCity->{$rNum} ? @{$rhCity->{$rNum}} : ();
  27.     print join (', ', $rNum, ($rName) x 3), "\n";
  28.     my $ge1 = 0;
  29.     foreach my $raCity (@aCity){
  30.         my ($cNum, $cName) = @$raCity;
  31.         my @aCom = $rhCom->{$cNum} ? @{$rhCom->{$cNum}} : ();
  32.         if (!@aCom and $ge1++){
  33.             print join (', ', $rNum, $rName, ($cName) x 2), "\n";
  34.             next;
  35.         }
  36.         foreach my $raCom (@aCom){
  37.             my $com = $raCom->[-1];
  38.             print join (', ', $rNum, $rName, $cName, $com), "\n";
  39.         }
  40.     }
  41. }

复制代码
perl abc.pl sheng shi qu
--------------------------------------------------------------------
1, 北京市, 北京市, 北京市
1, 北京市, 北京市, 东城区
1, 北京市, 北京市, 西城区
1, 北京市, 北京市, 崇文区
1, 北京市, 北京市, 宣武区
1, 北京市, 北京市, 朝阳区
1, 北京市, 北京市, 丰台区
1, 北京市, 北京市, 石景山区
1, 北京市, 北京市, 海淀区
1, 北京市, 北京市, 门头沟区
1, 北京市, 北京市, 房山区
2, 天津市, 天津市, 天津市
3, 河北省, 河北省, 河北省
3, 河北省, 唐山市, 唐山市
3, 河北省, 秦皇岛市, 秦皇岛市
3, 河北省, 邯郸市, 邯郸市
3, 河北省, 邢台市, 邢台市
3, 河北省, 保定市, 保定市
3, 河北省, 张家口市, 张家口市
3, 河北省, 承德市, 承德市
4, 山西省, 山西省, 山西省
5, 内蒙古自治区, 内蒙古自治区, 内蒙古自治区
6, 辽宁省, 辽宁省, 辽宁省
7, 吉林省, 吉林省, 吉林省
8, 黑龙江省, 黑龙江省, 黑龙江省




论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
8 [报告]
发表于 2016-10-27 10:26 |只看该作者
回复 6# 104359176
大神 那里看不懂 还请指出, 没发现哪里不对呀!!!???

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
9 [报告]
发表于 2016-10-27 12:21 |只看该作者
  1. sub Load1{
  2.     local @ARGV = shift;
  3.     my $rh = shift;
  4.     while (<>){
  5.         my ($num, $name, $id) = split;
  6.         push (@{$rh->{$id}}, [$num, $name]);
  7.     }
  8. }
复制代码

这里的 $rh, 没有声明是数组,就直接 push
local @ARGV = shift
从 args shift出的东西,竟然可以用 @来接收。

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
10 [报告]
发表于 2016-10-27 12:29 |只看该作者
回复 9# 104359176
这里的 $rh, 没有声明是数组,就直接 push
local @ARGV = shift
从 args shift出的东西,竟然可以用 @来接收。


大神 让您这么一说 我到有点崩溃了. 那您说这段代码该如何写才严谨, 谢谢您指点.

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP