perl格式化到代码中

aree 2010-11-23 10:41:04
我想在perl程序中,把当前的程序打印出来。
比如:
有一个a.pl
#!/usr/bin/perl
main();
sub main(){
if ($#ARGV != -1){
if ($ARGV[0] =~m/-readme/){
readme();
return 1;
}
}
print "hello,world";
}
sub readme{
print "#!/usr/bin/perl";
print "main();";
print "sub main(){";
.... 这里把所有的打印出来。
print "}";
}


然后我用工具把a.pl转成a.exe
最后我运行a.exe readme 就会出程序打印出来。
...全文
115 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
czl21 2011-02-17
  • 打赏
  • 举报
回复
在源文件最后放置

sub readme() {}

另外写个cmpReadme.pl 接收源文件为命令行参数,修改sub readme


#! /usr/bin/perl -w

# This script is used to complete readme routine.

open CODE, "<$ARGV[0]" or die $!;
open TEMP, '>temp.pl' or die $!;

my $times = 0;
while (<CODE>) {
if (/sub readme {/) {
last if $times++ > 0;
print TEMP "sub readme {\n print <<'MYCODE';\n";
seek(CODE, 0, 0);
next;
}
print TEMP $_;
}

print TEMP "MYCODE\n}\n";

close CODE;
close TEMP;

use File::Copy;
copy('temp.pl',$ARGV[0]) or die $!;



编译源文件前,先执行一次“cmpReadme.pl 源文件名”
iambic 2011-02-17
  • 打赏
  • 举报
回复
服了,隔了三个月继续解决……
aree 2011-02-17
  • 打赏
  • 举报
回复
实际上要把源代码也放到代码里,就是要把现原来perl源代码格式化成print "",里面需要进行perl的转义字符的处理。最后把这些print ""再放回到readme(){}函数里面就OK了。
aree 2011-02-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fibbery 的回复:]
引用 12 楼 aree 的回复:
各位,有特殊情况,我的这个tet.pl是打包的,已用工具perl_to_exe.exe转成test.exe
没有办法打印出来代码吧。主要是为了保密。

真没必要,兄弟,还是别这么想了。

如果把代码保存在打包后的exe中,如果不加密,使用编辑器打开照样能看到代码,因为是普通字符串,如果加密,你就要配备解密工具,这与代码在你自己那保存有什么两样吗?
[/Quote]

有道理,但别我不知道我里面还写有源代码的啊。加这种情况主要是以后要改代码可以找回源代码。自己另外保存会有时导致版本号一致。久了会忘记啊。

非常感谢!
aree 2011-02-15
  • 打赏
  • 举报
回复
各位,有特殊情况,我的这个tet.pl是打包的,已用工具perl_to_exe.exe转成test.exe
没有办法打印出来代码吧。主要是为了保密。
fibbery 2011-02-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 aree 的回复:]
各位,有特殊情况,我的这个tet.pl是打包的,已用工具perl_to_exe.exe转成test.exe
没有办法打印出来代码吧。主要是为了保密。
[/Quote]
真没必要,兄弟,还是别这么想了。

如果把代码保存在打包后的exe中,如果不加密,使用编辑器打开照样能看到代码,因为是普通字符串,如果加密,你就要配备解密工具,这与代码在你自己那保存有什么两样吗?
aree 2010-11-29
  • 打赏
  • 举报
回复
都没有理解问题意思。
sub readme{
open F,"$0" || die "open error";
while(<F>) {
print $_;
}
}

这只是把代码读出来显示,我还要求,把显示的这些代码要放回到代码中,print ""中的。主要是print中会对 转义符号要处理。
lvyinghong 2010-11-29
  • 打赏
  • 举报
回复
应该是

my $code =<<END_OF_CODE;
sub main(){
if ($#ARGV != -1){
if ($ARGV[0] =~m/-readme/){
readme();
return 1;
}
}
print "hello,world";
}
END_OF_CODE




lvyinghong 2010-11-29
  • 打赏
  • 举报
回复

my $code =<<END_OF_CODE
sub main(){
if ($#ARGV != -1){
if ($ARGV[0] =~m/-readme/){
readme();
return 1;
}
}
print "hello,world";
}
END_OF_CODE
proorck6 2010-11-24
  • 打赏
  • 举报
回复
二楼正解,用 $0 别忘了也给我点分。
friendly_ 2010-11-23
  • 打赏
  • 举报
回复
sub readme{
open F,"$0" || die "open error";
while(<F>) {
print $_;
}
}
aree 2010-11-23
  • 打赏
  • 举报
回复
像里面这段代码,有什么代码提出来,或用工具也行。
    print "#!/usr/bin/perl";
print "main();";
print "sub main(){";
.... 这里把所有的打印出来。
print "}";
一行一行手抄是很累的。
iambic 2010-11-23
  • 打赏
  • 举报
回复
不如做点有用的事情做练习……
lyingbo 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fandelei1982 的回复:]
Perl code
sub readme{
open F,"$0" || die "open error";
while(<F>) {
print $_;
}
}
[/Quote]

这个是很好的方法~~~
codesnail 2010-11-23
  • 打赏
  • 举报
回复
顶二楼,解释一下,特殊变量$0代表当前文件名,呵呵。。。。。。。。。。。
zuo_shen 2010-11-23
  • 打赏
  • 举报
回复
从文件中读,像楼上

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧