免费注册 查看新帖 |

Chinaunix

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

有关句柄含有变量内插的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-18 11:02 |只看该作者 |倒序浏览
本帖最后由 kingwmj 于 2011-05-18 21:02 编辑

因为有大量的重复,所以希望用一个循环来完成,所以我的句柄是有变量内插的。结果不对。请高手看看问题出在哪里了。
  1.    
  2. use IO::File;
  3. my $out=new IO::File(">/home/sciwmj/workspace/R/biopython/total_new_feature.txt") or die "$!";
  4. my @arr_para=("CN","HSEAU","HSEBU","HSEAD","HSEBD","RD","RDa");
  5. my $in_b=new IO::File("</home/sciwmj/workspace/R/biopython/b_factor/total_b_factor.txt") or die "$!";
  6. my $in_CN=new IO::File("</home/sciwmj/workspace/R/biopython/CN/total_CN.txt") or die "$!";
  7. my $in_HSEAU=new IO::File("</home/sciwmj/workspace/R/biopython/HSEAU/total_HSEAU.txt") or die "$!";
  8. my $in_HSEAD=new IO::File("</home/sciwmj/workspace/R/biopython/HSEAD/total_HSEAD.txt") or die "$!";
  9. my $in_HSEBD=new IO::File("</home/sciwmj/workspace/R/biopython/HSEBD/total_HSEBD.txt") or die "$!";
  10. my $in_HSEBU=new IO::File("</home/sciwmj/workspace/R/biopython/HSEBU/total_HSEBU.txt") or die "$!";
  11. my $in_RD=new IO::File("</home/sciwmj/workspace/R/biopython/RD/total_RD.txt") or die "$!";
  12. my $in_RDa=new IO::File("</home/sciwmj/workspace/R/biopython/RDa/total_RDa.txt") or die "$!";
  13. while(defined($l=<$in_b>)){
  14.      chomp $l;
  15.       print $out "$l";
  16.       for $para (@arr_para){
  17.       my $l2=readline('$in_'."$para");    #问题可能出在这里。
  18.       my @list=split/\s+/,$l2;  #切片
  19.       print $out " $list[-1] "     #取最后一个数值
  20.       }
  21.       print $out "\n";
  22. }
复制代码

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2011-05-18 11:18 |只看该作者
楼主牛啊,用这么多从来没用过的东西。 readline 从来没用过啊,一般都用<> ,词法变量是不能用名字访问的。
Perl 会自动转化变量,所以不需要 die "$!" 直接 die $! 就可以了。

论坛徽章:
0
3 [报告]
发表于 2011-05-18 12:25 |只看该作者
本帖最后由 kingwmj 于 2011-05-18 12:27 编辑
楼主牛啊,用这么多从来没用过的东西。 readline 从来没用过啊,一般都用 ,词法变量是不能用名字访问的。
...
zhlong8 发表于 2011-05-18 11:18

楼上就不要笑话我了,你可是拿过大奖的人。我这都是基本的数据处理, 以前不用循环,全手动列出来,现在想偷懒了。

    <>以前试过,那次我是用数组当句柄用,结果不行,用readline就可以了。
这一次我也试过,<>不行,readline也不行。
词法变量是啥意思啊,经常见,不知其意。

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
4 [报告]
发表于 2011-05-18 12:35 |只看该作者
你把句柄组放在HASH或者Array里面处理好了

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
5 [报告]
发表于 2011-05-18 14:18 |只看该作者
楼上就不要笑话我了,你可是拿过大奖的人。我这都是基本的数据处理, 以前不用循环,全手动列出来,现在想 ...
kingwmj 发表于 2011-05-18 12:25



    指的是用 my 声明的变量,这些变量正常情况下是无法通过名字访问的。通过你这种方式打开的文件其实是个引用,IO 相关的操作是可用的,像楼上说的保存到个数组里面再循环不就可以了。楼主不少用法很少见,多看点习惯下常用用法。 Perl IO 这块设计的不好后来又修修补补的很容易搞乱,楼主慢慢来

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
6 [报告]
发表于 2011-05-18 14:23 |只看该作者
回复 3# kingwmj


    Perl IO 操作的时候句柄可以用 FH 这样的 bareword 也可以用 $fh 这样的 scalar,两种虽然用法一样但实际上有很大区别,楼主可以花点时间搞明白

论坛徽章:
0
7 [报告]
发表于 2011-05-18 20:56 |只看该作者
本帖最后由 kingwmj 于 2011-05-18 20:58 编辑

谢谢zhlong8,ttcn_cu,用hash可以解决这个问题。
代码可以写成如下:
  1. #!/usr/bin/perl -w
  2. open(OUT,">/home/sciwmj/workspace/R/biopython/test.txt") or die "$!";
  3. my @arr_para=("b_factor","CN","HSEAU","HSEBU","HSEAD","HSEBD","RD","RDa");
  4. my %HIN;
  5. foreach $para (@arr_para){
  6. open($HIN{$para},"</home/sciwmj/workspace/R/biopython/$para/total_$para.txt") or die "$!";
  7. }
  8. while(defined($l=readline($HIN{b_factor}))){
  9.   chomp $l;
  10.   print OUT "$l";
  11.   for $para(keys %HIN){
  12.     my $l2=readline($HIN{$para});  
  13.     my @list=split/\s+/,$l2;     #切片
  14.     print OUT " $list[-1] "     #取最后一个数值
  15. }
  16. print OUT "\n";
  17. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2011-05-18 21:00 |只看该作者
指的是用 my 声明的变量,这些变量正常情况下是无法通过名字访问的。通过你这种方式打开的文件其 ...
zhlong8 发表于 2011-05-18 14:18



    再问zhlong8一个问题,你说的词法变量不能用名字访问是什么意思?我有点不太理解,是因为用my修饰过了吗?

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
9 [报告]
发表于 2011-05-18 21:29 |只看该作者
记得这个帖子的new写法看着比较舒服
不过你的解法应该也是对的

http://bbs.chinaunix.net/viewthr ... ;page=1#pid13535412

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
10 [报告]
发表于 2011-05-19 10:11 |只看该作者
再问zhlong8一个问题,你说的词法变量不能用名字访问是什么意思?我有点不太理解,是因为用my修饰 ...
kingwmj 发表于 2011-05-18 21:00



    指的是这里       my $l2=readline('$in_'."$para");   用 my 声明过的词法变量是通过位置索引的不是名字,这点和全局变量不同。就像 C 一样一旦编译通过词法变量名字都 “消失” 了,在运行时自然也就无法通过字符串形式的名字找回。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP