免费注册 查看新帖 |

Chinaunix

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

Yaml tag 怎么用 perl [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-10-17 09:57 |只看该作者 |倒序浏览
本帖最后由 luyi1983 于 2015-10-18 19:05 编辑

请教大家YAML 在perl中使用的问题:
主要是想可以调用自己定义的类型或者对象

1>
我希望key的value是一个引用。
比如 cb是个匿名call back函数。
那么当我用CB对应的值的时候就可以 &{$hashref->{CB}}() 调用匿名函数

my $cb = sub{...}
my ($hashref) = Load(<<'END_YAML');
CB: !!perl/ref
:= \$cb
END_YAML

2>
看到pyyaml中有个很好的功能,比如定义一个自己的class
然后,

    ao = yaml.load("""
    !!python/object:__main__.UserClass
    name: Foo
    hp: 1200
    """

可以直接调用UserClass中的方法:
ao.method(name,hp)

perl中有现成的实现吗?Yaml:erl?试了下好像不可以。。。

谢谢大家先

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
2 [报告]
发表于 2015-10-18 21:29 |只看该作者
看不懂代码,你还是禁用表情吧。用代码格式插入代码:
  1. my $cb = sub{...}
  2. my ($hashref) = Load(<<'END_YAML');
  3. CB: !!perl/ref
  4. := \$cb
  5. END_YAML
复制代码

  1.     ao = yaml.load("""
  2.     !!python/object:__main__.UserClass
  3.     name: Foo
  4.     hp: 1200
  5.     """
复制代码
  1. ao.method(name,hp)
复制代码

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
3 [报告]
发表于 2015-10-18 21:38 |只看该作者
Perl 内置的并没有对象的概念,是由 bless 过的引用才引发了对象的实现。在 Perl 中,内置的数据类型只有 Scalar, Array, Hash, Regex ... Perl5 中对对象的实现有很多种。

YAML 在 Perl 中没有实现对函数的引用的字面量表示。YAML 无法表示对别的数据的引用,这样会失去 YAML 数据文件的独立性。

Python 的 YAML 实现有很多独特的特性。

你可以把你想象中 Perl 应当的行为说出来

论坛徽章:
0
4 [报告]
发表于 2015-10-19 10:51 |只看该作者
谢谢楼上,
http://search.cpan.org/~ingy/YAML-1.15/lib/YAML.pod

YAML.pm also has the ability to handle code (subroutine) references and typeglobs.

我想做的事情是:
  1. YAML 格式是:
  2. Key: \$ref_sub;
  3. 而ref_sub是一个匿名函数的引用。
  4. 当我调用YAML中的这个Key的value时,我能以匿名函数的方式call它即&{$ref_sub}(arguments);
复制代码

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
5 [报告]
发表于 2015-10-21 01:41 |只看该作者
如果没有函数的表达式的字面量表示的话,YAML 即使有表示函数引用的表示方法,也没有任何意义。这样的 YAML 无法重新加载这个函数的引用, 就好像把当前数据的变量名称保存起来,下次加载后,如果在同一个程序中,同样的进程中,这个变量没有被回收的情况下,才不会出错,在这种情况下,有必要把数据保存起来然后加载吗?

论坛徽章:
0
6 [报告]
发表于 2015-10-30 13:12 |只看该作者
回复 5# 104359176


    config file的setting要real-time dynamically call back的时候。
    比如 exec_system: \$sub_ref
     然后在程序run-time的时候可以以不同的参数调用这个anomynous sub来实现call back。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
7 [报告]
发表于 2015-10-30 21:12 |只看该作者
回复 6# luyi1983


    你说的是不是把函数保存起来,下次动态的调用?
  1. my $call = sub { call() }
复制代码

论坛徽章:
0
8 [报告]
发表于 2015-10-30 22:20 |只看该作者
回复 7# 104359176


    是

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
9 [报告]
发表于 2015-11-01 02:57 |只看该作者
本帖最后由 104359176 于 2015-11-01 03:03 编辑

不管是 YAML, JSON 还是内置的 Dumper 都不能保存函数。除了用内置的 B::Deparse 模块,可以将代码编译成二进制,然后动态加载。

http://perldoc.perl.org/B/Deparse.html

虽然许多语言可以把函数当成 first class 类型来动态的加载,但支持序列化 function 的语言却很少。只有 Lisp 及其方言才支持。

其实许多需求是交换算法,而不是单单交换数据。我正在写一门语言,用于各种语言之间算法的交换。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP