免费注册 查看新帖 |

Chinaunix

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

哪位大侠有树的实例代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-05-14 00:01 |只看该作者 |倒序浏览
哪位大侠有树的实例代码,就像目录树一样,能从硬盘读入,可以遍历,画一个树结构,并写回硬盘。
谢谢!

论坛徽章:
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
2 [报告]
发表于 2017-05-14 21:10 |只看该作者
类似 Windows cmd 的 tree? 这东西有什么用处?

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
3 [报告]
发表于 2017-05-15 01:24 |只看该作者
本帖最后由 rubyish 于 2017-05-14 21:30 编辑

biru:

tree:
  1. [['Sophia',[['Emma',[['Olivia',[['Ava',undef],['Mia',undef]]]]],['Isabella',[['Riley',undef],['Aria',[['Zoe',undef],['Charlotte',[['Lily',[['Layla',undef]]]]]]]]]]],['Amelia',undef],['Emily',[['Madelyn',undef],['Aubrey',[['Adalyn',undef],['Madison',[['Chloe',[['Harper',undef],['Abigail',undef],['Aaliyah',undef],['Avery',undef]]]]]]],['Evelyn',undef],['Kaylee',undef],['Ella',[['Ellie',undef],['Scarlett',undef],['Arianna',[['Hailey',undef],['Nora',undef]]]]]]]]
复制代码


ex:
  1. my $tree = load 'tree';
  2. draw $tree;
  3. save 'test', $tree;
复制代码

code:
  1. #!/usr/bin/perl -w
  2. use 5.010;

  3. sub draw;
  4. sub load;
  5. sub save;

  6. my $tree = load 'tree';
  7. draw $tree;

  8. save 'test', $tree;

  9. my $test = load 'test';
  10. draw $test;

  11. #__sub__

  12. sub load { do shift }
  13. sub draw { D_( @_, [] ) }

  14. sub save {
  15.     my ( $file, $tree ) = @_;
  16.     open my $save, '>', $file;
  17.     print $save S_($tree);
  18.     close $save;
  19. }

  20. sub D_ {
  21.     state $his = [];
  22.     my ( $do, $mo ) = @_;
  23.     if ( !defined $do ) {
  24.         for ( my $i = 0 ; $i <= $#$mo ; $i += 2 ) {
  25.             if ( !defined $his->[$i] || $mo->[$i] ne $his->[$i] ) {
  26.                 print "|- $mo->[$i] ";
  27.             }
  28.             else {
  29.                 my $tab = $mo->[ $i + 1 ] ? ' ' : '|';
  30.                 print $tab . ' ' x ( length( $his->[$i] ) + 3 );
  31.             }
  32.         }
  33.         print "\n";
  34.         $his = $mo;
  35.         return;
  36.     }
  37.     D_( $_->[1], [ @$mo, $_->[0], 0 ] ) for @$do[ 0 .. $#$do - 1 ];
  38.     D_( $do->[-1][1], [ @$mo, $do->[-1][0], 1 ] );

  39. }

  40. sub S_ {
  41.     my $t = shift;
  42.     '[' . join( ',',
  43.         map { ref ?  S_($_) : defined ? "'$_'" : 'undef' } @$t
  44.     ) . ']';
  45. }

  46. __DATA__
  47. $_
复制代码


评分

参与人数 1信誉积分 +10 收起 理由
hztj2005 + 10 很给力!谢谢大侠出手,运行了可以用。

查看全部评分

论坛徽章:
0
4 [报告]
发表于 2017-05-15 20:35 |只看该作者
回复 2# sunzhiguolu

论坛也不全是老手,别人可能也就是借此熟悉Perl,你就不能体谅一下。

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
5 [报告]
发表于 2017-05-15 20:46 |只看该作者
本帖最后由 523066680 于 2017-05-15 21:22 编辑

2015年写的一个 个人 WIKI 记事工具,基于Win32::Console
通过 YAML 模块保存和读取数据。可能对别人来说并没有什么卵用,但是我用来记工作和生活中用到的很多网站的账号和密码
密码都是提示,非明文。主要是终端调用方便,响应速度快。

[Perl]终端版信息整理、分类、浏览工具 - http://bbs.bathome.net/thread-36971-1-2.html
(真的不好意思在这里发,牛人太多,怕被鄙视。)

最后给楼主提供一些参考:
要建立并编辑修改一个树状结构,顶层用 hash 比较合适,通过数据引用的方式,可以在里面大量创建"子键"和对应的值。
要保存和再次加载数据结构,可以用 Data::Dumper, YAML, YAML::Tiny, Storable, JSON 等模块。
这个方面推荐阅读 《Perl 进阶》,都是干货
关于递归多层的数据处理,推荐阅读 《高阶 Perl》,干货满满。

自动创建一个任意层的散列(这个确实然并卵,就是个参考)
  1. use YAML;

  2. my $data = {};
  3. my $ref = $data;

  4. for my $c ('a' .. 'e')
  5. {
  6.     $ref->{'info'} = ord($c);
  7.     $ref->{$c} = {};
  8.     $ref = $ref->{$c};
  9. }

  10. print Dump($data);
复制代码
输出
---
a:
  b:
    c:
      d:
        e: {}
        info: 101
      info: 100
    info: 99
  info: 98
info: 97


评分

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

查看全部评分

论坛徽章:
0
6 [报告]
发表于 2017-05-15 23:19 |只看该作者
回复 2# sunzhiguolu

我们这个世界有的事物是线性的,txt这种文本就可以记录。有的事物有m个成员,每个成员有n个属性,关系数据库就用来记录。
还有的事物是等级结构的,比如硬盘中的文件夹,一个国家的行政区划,家族的亲子关系,语言中句子的成分结构,都需要tree来记录。

论坛徽章:
0
7 [报告]
发表于 2017-05-15 23:46 |只看该作者
回复 5# 523066680
[Perl]终端版信息整理、分类、浏览工具 - http://bbs.bathome.net/thread-36971-1-2.html

看了一下,这个代码要是理解了,就我当下来说就足够了。
不过有个问题进一步请教,代码766行:
use Win32::Clipboard;

我的win10是64bit,运行这个代码时需要安装上面这个模块,我试着用cpan 安装这个模块,但是安装时测试没通过

Test Summary Report
-------------------
t/test.t (Wstat: 0 Tests: 9 Failed: 1)
  Failed test:  3
Files=1, Tests=9,  0 wallclock secs ( 0.05 usr +  0.02 sys =  0.06 CPU)
Result: FAIL
Failed 1/1 test programs. 1/9 subtests failed.
dmake.exe:  Error code 255, while making 'test_dynamic'
  JDB/Win32-Clipboard-0.58.tar.gz
  D:\Strawberry\c\bin\dmake.exe test -- NOT OK
//hint// to see the cpan-testers results for installing this module, try:
  reports JDB/Win32-Clipboard-0.58.tar.gz
Stopping: 'install' failed for 'Win32::Clipboard'.
Failed during this command:
JDB/Win32-Clipboard-0.58.tar.gz              : make_test NO

所以请教一下,你是什么环境下运行你这个代码的?



论坛徽章:
0
8 [报告]
发表于 2017-05-15 23:47 |只看该作者
本帖最后由 hztj2005 于 2017-05-15 23:50 编辑

出错了,重复提交。

论坛徽章:
0
9 [报告]
发表于 2017-05-15 23:48 |只看该作者
本帖最后由 hztj2005 于 2017-05-15 23:51 编辑

出错了,重复提交。

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
10 [报告]
发表于 2017-05-16 09:18 |只看该作者
本帖最后由 523066680 于 2017-05-16 09:37 编辑

回复 7# hztj2005

我是 WIN7 64位,( 我也想要加分   
Win32::Clipboard 是用来处理剪切板的接口,不是必须的,你可以去掉。

安装的话从 CPAN 上面下载压缩包自己安装成功率会高一点点。
perl Makefile.PL
dmake
dmake install

最近感觉 Strawberry Perl + 从 CPAN.org 下载模块手动安装成功率更高。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP