2009年1月8日星期四

Re: 答复: [PerlChina] Re: Win32::TieRegistry

我想你遇到的问题应该是对于注册表层次结构的理解:
> 假设在注册表的一个项下,有子项1,子项2,... ,值1,值2,..
> 在这里"子项1,子项2,... ,值1,值2,.."是同一级的,而注册表值对应
> 的数据则属于下一级。

HI henryli:
你的表达比我的清楚多了,所以我就引用一下你的.我现在碰到的问题是:当我pirnt keys %{$sub_key};

结果只显示:子项1,子项2,... ;而不显示:值1,值2,..
如果我print values %{$sub_key},也仅显示子项的内容,并没有值的内容.
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina 论坛"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 使用perl来解析C代码

2009/1/7 allen <allenogz@gmail.com>
近几天在看编译原理,了解一些编译器怎么工作的,然后就想自己写个最简单的编译器
比如: 对C代码的分析
 
昨天比较匆忙,今天忍不住多说几句,哈哈:
 
严重支持你自己用 Perl 实现一个比较完整的 ANSI C 解析器,甚至一个比较完整的 ANSI C 编译器. 目标代码可以选择 Perl 当然也可以选择某种汇编甚至 x86 机器指令,呵呵. 性能和实用性倒在其次, 倒是这个过程中可以演练各种有趣的编译技术,同时加深对 C 语言的理解. 其实我自己从前上学的时候也一直很想做这个来着,哈哈。这里练得不仅是解析技术,还是 AST 变换,代码优化,代码生成等许多有意思的方面 :)
 
Perl 5 虽然算不上编写编译器的理想语言,但用来快速建模和构建学习性的项目,还是非常合适的。(在我看来,比较理想的构建编译器的语言就是 Perl 6 和 Haskell 了,呵呵。)
 
不过,如果想从最简单的编译器着手,可以选择 C 语言的一个比较核心的子集,就像"编译原理及编程"一书中以 TinyC 作为示例一样.
 
上大学的时候,我曾经做过一种类 Pascal 语法的小语言编译器。该语言叫做 Kid:
 
 
当时的主要目的是为了辅助我的"程序设计方法学"课程中有关编程语言形式语义和正确性证明方面的理论学习。该编译器虽然实现了 Perl 代码生成器后端,但它最主要的后端是生成基于 Maple 的数学模型,并用于程序的数学变换和语义归约。记得当时把我们当时用的教材( http://product.dangdang.com/product.aspx?product_id=7421392 )中的例题都证明出来了。当然,这本教材本身写得错误百出,所以真正看明白书中的那些原理需要查阅资料和大量的巧克力(提神用)。
 
但值得注意的是,Kid 中虽然实现了变量,赋值,代数运算符,函数定义和调用,完整的 if/else 语句,逻辑运算符等众多语言结构,却有意没有实现循环和递归。因为这些结构在自动化语义归约中需要引入"循环不变式",而"循环不变式"的自动推导我还没找到也没想到比较通用的办法。
 
Kid 编译器使用 Parse::RecDescent 模块构造出词法和语法分析器(文法定义在 http://svn.berlios.de/svnroot/repos/unisimu/Methodology/Kid/grammar/kid.grammar ),并在解析过程中构造出 AST。随后有许多复杂的 AST 变换过程(比如函数调用时的内联展开),则利用了 Luke Palmer 的属性文法引擎 Language::AttributeGrammar 模块完成。这些模块的性能都不算好,但非常好用,呵呵。
 
其实,实现 Perl 5 的一个核心子集也是挺好玩的,而且这样也有机会实现"自举"(self-hosting)。自举应当是编译理论中最优美的东西之一了,以至于 Pugs team 从前在 #perl6 中讨论最多的就是这个问题,许多开发工作也是围绕 Perl 6 的自举问题展开的(一种观点就是 bootstrap early, bootstrap often)。
 
从这个意义上说, Pugs::Compiler::Rule 自身的 parser 也是实现了自举的(很高兴我去年最终替 fglock++ 完成了这项工作)。一个有趣的副产品是一个 Perl 6 正则的图形化 tracer:
 
 
这也是一个借用 web 界面实现 GUI 应用的一个例子,虽然限于当时的 web 开发水平,做得丑了一点 :P
 
我还曾经自己实现过一个简化了的 Parse::RecDescent 模块,并让之实现了 parser grammar 部分的自举:
 
 
实现了自举的编译器就不仅仅是"写程序的程序"了,而且还是"写自己的程序".在"脱靴"(bootstrapping)的过程中,我借用了 Parse::RecDescent,但一旦完成自举之后,便不再依赖于它了。
 
Larry 这两年开发的疯狂的针对最终的 Perl 6 正则引擎的 STD parser generator 最初也是依赖一个名叫 TRE 的 C 库:
 
 
在几个月前 STD parser 也不再依赖 TRE 了,详情见(http://use.perl.org/~chromatic/journal/37875)呵呵。
 
欢迎大家讨论基于 Perl 的编译器/解释器构造技术,并批评指正我的不妥之处 :P
 
Thanks!
-agentzh
 
P.S. 感觉又可以以"漫谈基于 Perl 的编译器构造技术"为题发到我自己的 blog 上去了,呵呵

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina 论坛"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: Perl GUI 编程学习

sigh, 一个个都冒出来了。:0

y6cmE wrote:
> 呵呵,见到老朋友了。
>
> 在09-1-9,*Jester* <jester@perlchina.org
> <mailto:jester@perlchina.org>> 写道:
>
> 呵呵,那会儿很迷Perl/Tk,天天泡在论坛里。
> 现在人老了,热情也减退了……
>
>
> ----- Original Message -----
> From: "Beckheng Lam" <bi.ken.lam@gmail.com
> <mailto:bi.ken.lam@gmail.com>>
> To: <perlchina@googlegroups.com <mailto:perlchina@googlegroups.com>>
> Sent: Friday, January 09, 2009 9:34 AM
> Subject: [PerlChina] Re: Perl GUI 编程学习
>
>
> > 我印象中,当年Jester还替我的一个小程序用Tk写过GUI的界面。 ;-)
> >
> > Jester wrote:
> > > 呵呵,几年前曾经对Tk比较感兴趣,做过一些小程序,还在原来
> perlchina的论坛里翻译过一个"Tk常见问题"的文档。
> > > 可惜这两年工作太忙了,用的比较少了,不过应该还记得一些,有兴趣
> 可以多交流。
> > >
> > > 另外,记得原来perlchina还组织过一个Mastering Perl/Tk的翻译项目,
> > > 实在惭愧,我认领的那一章翻译了一半就放下了,现在已经找不到原来
> 的那个页面了……:(
> > > 不过这本书学习Perl/Tk还是挺不错的,建议看看。
> > >
> > > 祝各位Perler新年快乐!^_^
> > >
> > > Jester
> > >
> >
> > >
> >
>
> >


--
Fayland Lam // http://www.fayland.org/
Foorum based on Catalyst // http://www.foorumbbs.com/


--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina 论坛"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: Perl GUI 编程学习

是呀,自从tsingson的论坛关闭后,好久不见了。^_^
y6cmE才是Perl GUI的高手哦。
 
----- Original Message -----
From: y6cmE
Sent: Friday, January 09, 2009 12:32 PM
Subject: [PerlChina] Re: Perl GUI 编程学习

呵呵,见到老朋友了。
 

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina 论坛"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: Perl GUI 编程学习

呵呵,见到老朋友了。

在09-1-9,Jester <jester@perlchina.org> 写道:
呵呵,那会儿很迷Perl/Tk,天天泡在论坛里。
现在人老了,热情也减退了……


----- Original Message -----
From: "Beckheng Lam" <bi.ken.lam@gmail.com>
To: <perlchina@googlegroups.com>
Sent: Friday, January 09, 2009 9:34 AM
Subject: [PerlChina] Re: Perl GUI 编程学习


> 我印象中,当年Jester还替我的一个小程序用Tk写过GUI的界面。 ;-)
>
> Jester wrote:
> > 呵呵,几年前曾经对Tk比较感兴趣,做过一些小程序,还在原来perlchina的论坛里翻译过一个"Tk常见问题"的文档。
> > 可惜这两年工作太忙了,用的比较少了,不过应该还记得一些,有兴趣可以多交流。
> >
> > 另外,记得原来perlchina还组织过一个Mastering Perl/Tk的翻译项目,
> > 实在惭愧,我认领的那一章翻译了一半就放下了,现在已经找不到原来的那个页面了……:(
> > 不过这本书学习Perl/Tk还是挺不错的,建议看看。
> >
> > 祝各位Perler新年快乐!^_^
> >
> > Jester
> >
>
> >
> --~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina 论坛"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

答复: [PerlChina] Re: Win32::TieRegistry

Joe jiang 的回答是没有问题的。

我想你遇到的问题应该是对于注册表层次结构的理解:
假设在注册表的一个项下,有子项1,子项2,... ,值1,值2,..
在这里"子项1,子项2,... ,值1,值2,.."是同一级的,而注册表值对应
的数据则属于下一级。
了解这点之后,回到你的例子:
Print $sub_key->{"360Safebox"} 实际上是以注册表值"360Safebox"为
key,取HASH中的value

因此,如果想取同时取到子键,值和数据,只需做一个简单的模式匹配来区分
子项和注册表值即可。另外,要遍历一个注册表项下的所有信息,可以写一个简单的递
归来实现。


Best regards

Henry Li


-----邮件原件-----
发件人: perlchina@googlegroups.com [mailto:perlchina@googlegroups.com] 代表
shandaw
发送时间: 2009年1月9日 10:06
收件人: PerlChina 论坛
主题: [PerlChina] Re: Win32::TieRegistry


可能是我没表达清楚,我说的值不是hash表里的value,我是说注册表的值(注册表
有:项,值,数据。三种类型),比如:
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
\360Safebox,这个值的value可能等于"C:\Program
Files\360Safebox\safeboxTray.exe".
如果我的$sub_key=$Registry->Open("\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
\Windows\CurrentVersion\Run\"),那我
foreach my $key ( keys %{$sub_key})
{
print "\n$key";

}

结果只显示Run下面的子项,却没有360Safebox等值,但我如果print
$sub_key->{"360Safebox"},却又能显
示"C:\Program Files\360Safebox\safeboxTray.exe".



--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina 论坛"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

[PerlChina] Perl GUI 编程学习

呵呵,那会儿很迷Perl/Tk,天天泡在论坛里。
现在人老了,热情也减退了……


----- Original Message -----
From: "Beckheng Lam" <bi.ken.lam@gmail.com>
To: <perlchina@googlegroups.com>
Sent: Friday, January 09, 2009 9:34 AM
Subject: [PerlChina] Re: Perl GUI 编程学习


> 我印象中,当年Jester还替我的一个小程序用Tk写过GUI的界面。 ;-)
>
> Jester wrote:
> > 呵呵,几年前曾经对Tk比较感兴趣,做过一些小程序,还在原来perlchina的论坛里翻译过一个"Tk常见问题"的文档。
> > 可惜这两年工作太忙了,用的比较少了,不过应该还记得一些,有兴趣可以多交流。
> >
> > 另外,记得原来perlchina还组织过一个Mastering Perl/Tk的翻译项目,
> > 实在惭愧,我认领的那一章翻译了一半就放下了,现在已经找不到原来的那个页面了……:(
> > 不过这本书学习Perl/Tk还是挺不错的,建议看看。
> >
> > 祝各位Perler新年快乐!^_^
> >
> > Jester
> >
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina 论坛"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---