免费注册 查看新帖 |

Chinaunix

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

用什么模块可以分析出 perl程序的 输入和输出文件的文件名 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-16 16:02 |显示全部楼层 |倒序浏览
我现在要实现一个功能  用perl 分析 perl的程序

有没有能分析perl调用数据情况的模块  

譬如:
程序test.pl

  1. my $file1 = '/home/xxx/';
  2. $file1 .=  '1.txt';

  3. open(FF,$file1);
  4. while(<FF>){
  5.    print;
  6. }
  7. close(FF);

  8. open(FF,">/home/xxx/xxx.tmp");
  9. print FF "testste";
  10. close(FF);

复制代码


我怎么能方便的得到 输入  /home/xxx/1.txt  和  输出/home/xxx/xxx.tmp 这两个文件的文件名

我找了 cpan 在 Devel::* 下的一些模块  没发现

有没有什么好方法 可以像  perl -d* test.pl  然后生成一个报告

btw: 请教过一位朋友 用 PERLDB_OPTS="NonStop frame=1 AutoTrace LineInfo=tperl.out" perl -dlane 'print $F[0]' /etc/xxx 可以求出一些信息
再分析  虽然能实现但是  不是特别方便

[ 本帖最后由 hitsubunnu 于 2009-2-16 17:31 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-02-16 17:30 |显示全部楼层
原帖由 ly5066113 于 2009-2-16 17:18 发表
perldoc File::Basename


不好意思没说清楚  我想要知道所有用open打开的所有文件的文件名

这个模块是 知道用open打开的是哪个文件后 再利用这个模块 找出路径和文件名  没有办法用去取得 open打开的是文件名

谢谢诶

[ 本帖最后由 hitsubunnu 于 2009-2-16 17:43 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-02-17 00:00 |显示全部楼层
1.不如说说你取它干什么?

我这儿有一个写了很久很大的程序  没使用数据库   都是直接操作文件的 经过很多人更改过 因为历史问题  没有留下任何文档  现在程序出现问题时只能一行行代码看 经常为了找一个文件是从哪里来的 花费很长时间 所以我现在希望能开发一个类似dubug分析perl的程序 能把程序 调用数据的情况 分析出来

2.根据 filehandle 找到它对应的文件名?

  主要就是想知道  整个程序的  从哪些文件取得的数据  最后生成了哪些文件  把所有调用过的文件记录下来

3.重载open 试验过了  没能实现


我的想法:

1.因为看到devel::* 下有一些可以  测试内存使用情况 或者是 程序执行时间分析的模块

所以我觉得. 应该可能会有一些模块涉及到 对输入输出文件做记录

2. perl在解释执行之前是不是会对文件位置做标记  比如说  open(FF,**) die "$!\n";

在判断 $! 信息 的时候  perl是怎么实现的 ? 是不是能在perl解释执行前  做些事情


有没有谁接触过类似的东西 给个方向我去查一查

[ 本帖最后由 hitsubunnu 于 2009-2-17 00:08 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-02-17 13:46 |显示全部楼层
原帖由 flw 于 2009-2-17 09:19 发表

办法太多了。
我起码想到了三种。

先试试 ltrace 行不行。


我现在的做法就是


  1. PERLDB_OPTS="NonStop frame=1 AutoTrace LineInfo=tperl.out"
复制代码

分析 tperl.out 这个文件  取出 open所在行  

然后 在debug的时候 用b设置断点  在用p 获得 $file的 路径和文件名


另外两个方法是什么?

论坛徽章:
0
5 [报告]
发表于 2009-02-17 14:07 |显示全部楼层
原帖由 cobrawgl 于 2009-2-17 13:50 发表
我也有个办法,比较麻烦些

你把 open 包装一下,然后用 Hook::LexWrap;



Hook::LexWrap  这个模块  好像要和程序写在一起  不能从外面分析

谢谢

我正在研究怎么写一个debug程序  perl本身提供了个  DB 的模块 是开发debug程序的api  但是资料太少

论坛徽章:
0
6 [报告]
发表于 2009-02-19 11:59 |显示全部楼层
原帖由 DQP 于 2009-2-19 11:21 发表
通了 谢谢
而且看到了一种原先没用过的写法: local 的file handle

sub glob {
  my $pat = shift;
  my @got;
  local(*D);
  if (opendir D, '.') {
    @got = grep /$pat/, readdir D; closedir ...


麻烦 贴一下怎么包的 open

论坛徽章:
0
7 [报告]
发表于 2009-02-19 13:36 |显示全部楼层
原帖由 cobrawgl 于 2009-2-19 13:13 发表
use Hook::LexWrap;

wrap 'my_open', pre => sub {print @_;};

sub my_open {}


my $file1 = '/home/xxx/';
$file1 .=  '1.txt';

open(FF,$file1);
my_open(FF,$file1);
while(){
   print;
...


谢谢  :wink:

兄弟这个和


  1. open(FF,$file1);
  2. 下插入一个
  3. print $file1;

复制代码


效果差不多

[ 本帖最后由 hitsubunnu 于 2009-2-19 13:45 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-02-19 15:35 |显示全部楼层
原帖由 DQP 于 2009-2-19 14:34 发表
我是这么做的
再单独写个文件

sub my_open{
  print @_, caller(), "\n";
  open($_[0], $_[1]);
}
*CORE::GLOBAL:pen = \&my_open;

do 'your_program.pl';


------------------------- your_ ...



非常感谢

论坛徽章:
0
9 [报告]
发表于 2009-02-19 16:22 |显示全部楼层
perldoc  真是 博大精深 啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP