免费注册 查看新帖 |

Chinaunix

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

求帮忙看为什么这个if循环工作不正常 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-11-18 07:14 |只看该作者 |倒序浏览
<code>
while(defined(my $m_z_value = <$ff>)) {
        $m_z_value =~ s/^\s+//;
    chomp $m_z_value;
        if ($tmp_to <= $to and $m_z_value <= $to){
                if ($m_z_value < $from){
                goto MIRACLE;
                }
                else{
                        if($m_z_value = $from){
                                $mass = $mass + $m_z_value;
                                $whole_mass = $whole_mass +$m_z_value;
                                ++$bin_pepnumber;
                                ++$whole_pepnumber;
                       
                                print "$bin_number\t\t $tmp_from\t $tmp_to\t $bin_pepnumber\t\t $mass/$bin_pepnumber\n";
                        }
                        else{
                                if ($m_z_value >= $tmp_from and $m_z_value <= $tmp_to) {       
                                $mass = $mass + $m_z_value;
                                $whole_mass = $whole_mass +$m_z_value;
                                ++$bin_pepnumber;
                                ++$whole_pepnumber;       
                                }
                                else{
                                        if ($m_z_value>$tmp_to){
                                        print "$bin_number\t\t $tmp_from\t $tmp_to\t $bin_pepnumber\t\t $mass/$bin_pepnumber\n";
                                        ++$bin_number;
                                        $mass = $m_z_value;
                                        $whole_mass = $whole_mass + $m_z_value;
                                        $bin_pepnumber = 1;
                                        ++$whole_pepnumber;
                                        $tmp_from = $tmp_from + $intervals;
                                        $tmp_to = $tmp_to + $intervals;
                                        }
                                        }
                                }
                        }
                }               
MIRACLE:
        }
<\code>

在这个循环里,我想表达的其实是,每个if基本都是并列的,阅读一个文件的每一行,判断这一行分别在大于某区间,在区间内和大于区间的时候该做什么。
但是这个程序运行到第二个if,假如这一行的值正好等于$from的时候,在debug中会,$m_z_value这个变量会直接变成$from的值,不论怎么改它都会在运行到这里的时候变成这个值。

求救!这个问题已经至少放倒了俩人了。

论坛徽章:
0
2 [报告]
发表于 2015-11-18 11:27 |只看该作者
($m_z_value = $from)??

评分

参与人数 1信誉积分 +10 收起 理由
substr函数 + 10 赞一个!

查看全部评分

论坛徽章:
0
3 [报告]
发表于 2015-11-19 02:22 |只看该作者
回复 2# 815138698

没看明白你的意思。
帖子里说了,这一句想表达的是如果等于的话执行下面区块的文件。
我在后面的修改中将“=”改成了“==”就好使了,但是这个查不到原因。而且表述感觉也并不合法。

所以想知道问题的根源所在。

   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
4 [报告]
发表于 2015-11-19 09:21 |只看该作者
回复 3# alphafighter

不是语法(syntax)错误
而是语义错误,原因是误用===语法

解决方法打开warnings跟strict
use strict;
use warnings;
   

评分

参与人数 1信誉积分 +10 收起 理由
substr函数 + 10 赞一个!

查看全部评分

论坛徽章:
0
5 [报告]
发表于 2015-11-19 18:14 |只看该作者
本帖最后由 alphafighter 于 2015-11-19 18:15 编辑
  1. #! /usr/bin/perl
  2. use strict;
  3. use warnings;

  4. # get the mz value and make it easier to use{
  5. my $dummyfile = "dummy.pepmasses"; #filename defined here
  6. my @mzco;


  7. open my $fh, "<" , $dummyfile or die "Unable to open $dummyfile:$!";
  8. readline $fh;
  9. while (my $line = <$fh>){
  10.         #read each line in file
  11.         chomp $line;
  12.         my $mz_value = (split/\s+/,$line)[2]; #pick column 2th at everyline
  13.        
  14.         push (@mzco,$mz_value);  #add them all in one array @mzco
  15. }
  16. open (FILE, ">tmp.data");
  17. print FILE join("\n",@mzco),"\n";
  18. close $fh;
  19. close FILE;

  20. my $tmpdata = "tmp.data";
  21. open my $fa, "<", $tmpdata or die "Unable to open $tmpdata:$!";
  22. my @mvalue = <$fa>;
  23. my @somvalue = sort { $a <=> $b } @mvalue;

  24. open (FI,">tmpf.data");
  25. print FI"@somvalue";
  26. close FI;

  27. # }

  28. my $tmpf = "tmpf.data";
  29. open my $ff, "<" , $tmpf or die "Unable to open $tmpf:$!";

  30. my $text = ();

  31. # get rage and intervals
  32. print "what range of information do you want to know?\n";
  33. # sample text : 1000-4000-250-result

  34. chomp($text = <STDIN>);

  35. my ($from,$to,$intervals) = split (/\s+/,$text);

  36. my $whole_pepnumber = 0;
  37. my $whole_mass = 0;
  38. my $mass = 0;
  39. my $bin_pepnumber = 0;
  40. my $bin_number = 0;
  41. my $tmp_from = $from;
  42. my $tmp_to = $tmp_from + $intervals;

  43. # head line of final result
  44. print "Bin number\t From\t To\t peptide number\t average m\/z value\n";
  45. # get the number of bins
  46. readline $ff;
  47. while(defined(my $m_z_value = <$ff>)) {
  48.         $m_z_value =~ s/^\s+//;
  49.         GOD:
  50.     chomp $m_z_value;
  51.         if ($tmp_to <= $to and $m_z_value <= $to){
  52.                        
  53.                 if($m_z_value >> $tmp_to){
  54.                         ++$bin_number;
  55.                         print "$bin_number\t\t $tmp_from\t $tmp_to\t 0\t\t -\n";
  56.                         $tmp_from = $tmp_from + $intervals;
  57.                         $tmp_to = $tmp_to + $intervals;
  58.                         goto GOD;
  59.                 }else{
  60.                 if ($m_z_value < $from){
  61.                 goto MIRACLE;
  62.                 }
  63.                 else{
  64.                         if($m_z_value == $from){
  65.                                 $mass = $mass + $m_z_value;
  66.                                 $whole_mass = $whole_mass +$m_z_value;
  67.                                 ++$bin_pepnumber;
  68.                                 ++$whole_pepnumber;
  69.                        
  70.                                 print "$bin_number\t\t $tmp_from\t $tmp_to\t $bin_pepnumber\t\t $mass/$bin_pepnumber\n";
  71.                         }
  72.                         else{
  73.                                 if ($m_z_value >= $tmp_from and $m_z_value <= $tmp_to) {       
  74.                                 $mass = $mass + $m_z_value;
  75.                                 $whole_mass = $whole_mass +$m_z_value;
  76.                                 ++$bin_pepnumber;
  77.                                 ++$whole_pepnumber;       
  78.                                 }
  79.                                 else{
  80.                                         if ($m_z_value > $tmp_to){
  81.                                         print "$bin_number\t\t $tmp_from\t $tmp_to\t $bin_pepnumber\t\t $mass/$bin_pepnumber\n";
  82.                                         ++$bin_number;
  83.                                         $mass = $m_z_value;
  84.                                         $whole_mass = $whole_mass + $m_z_value;
  85.                                         $bin_pepnumber = 0;
  86.                                         ++$whole_pepnumber;
  87.                                         $tmp_from = $tmp_from + $intervals;
  88.                                         $tmp_to = $tmp_to + $intervals;
  89.                                         goto GOD;
  90.                                         }
  91.                                         }
  92.                                 }
  93.                         }
  94.                 }               
  95. MIRACLE:
  96.        
  97.         }
  98. }
  99. print "The peptide number in the range is $whole_pepnumber\n";
  100. my $average_mass = $whole_mass / $whole_pepnumber;
  101. print "The average m\/z value is $whole_mass/$whole_pepnumber";
复制代码
上面的是完整的代码。是有use strict和use warning的。但是源代码在运行中并没有反应任何有关后面的if跟else的部分。
因为不能直接插入图片,所以我把异常的情况更详细地说一下。
100到300范围,区间大小为20的时候。
其他数据都正常,只有240到260是0,而原处理数据中这个部分很明显不是0。经检查,发现,在其他行运行的时候,
if($m_z_value >> $tmp_to){ (这一行是后加的判定)
这一行的>>都是作大于号的,只有运行到240到260的时候,这一行会突然失效,我用了debug,当运行到这个区间的时候,$mz_v_value最小的值为245,最大的为259,$tmp_to为260,明明这个if在这里是false,但是程序就是会执行下面的代码。然后到260到280就会又恢复正常。

然后每次的范围总会漏掉最后一个区间。

我试验了更大的区间,1000到5000,区间大小为50,结果发现,之前那个莫名其妙失效的效果的出现完全没有规律,3,4,12,6,5,3,4,3,4. 前面的是它会出现的大概间隔。
@jason680

论坛徽章:
0
6 [报告]
发表于 2015-11-19 20:13 |只看该作者
你以为 >> 是干嘛的??  !!!!!!!!!!!!!!!!!!!!

论坛徽章:
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
7 [报告]
发表于 2015-11-19 21:34 |只看该作者
代码排版很漂亮,但是不是你写的唉,感觉你什么也不懂

>> 是位移操作,相当于除以 2 的 N 次方。if () 的括号里面是赋值表达式,相当于判断赋的那个值是不是 false (包括 0, "", "0" 这个语法是抄C语言的,C语言中也是常见错误,平时 use strict; use warnings; 会提醒在 if 中用了赋值表达式,你需要的可能是 ==
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP