吐血求教:除数为零

吐血求教:除数为零

前边代码不赘述了,问题出在这部分,
一个数组@date_data,内容如下:2007-09-30 5567.0 2007-06-30 4247.4 2007-03-31 2625.9 2006-12-31 10263.8 2006-09-30 4837.2 2006-06-30 3336.8 2005-12-31 7189.9 2004-12-31 14072.7

然后%date_data=@date_data;#%date_data现在以日期为key,以数据为value

想算一个同比增长,my $tbzz=(($date_data{"2007-09-30"}-$date_data{"2007-06-30"})-($date_data{"2006-09-30"}-$date_data{"2006-06-30"}))/($date_data{"2006-09-30"}-$date_data{"2006-06-30"});
然后    Illegal division by zero at .................

吐血求指导,哪位老师赐教都行。

大家好热心,感谢。接守批评,4楼有要处理的文本和全部代码,请各位老师们继续指教。

怎么就除数为0了呢?
语句都没有贴齐,叫别人怎么看哪?
你的代码是不是贴错了
明显不是零
错的是其他地方吧
对不起,我贴个全部的。
处理类似这样格式的文本
【历年简要财务指标】                                       单位(元)
━━━━━━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━━
   指标\报告期   │2007-09-30│2007-06-30│2007-03-31│2006-12-31
──────────┼─────┼─────┼─────┼──────
 每股收益        │    0.0925│    0.0706│    0.0436│    0.1700
 每股收益扣除   │    0.0910│    0.0677│    0.0436│    0.1700
 每股净资产      │    5.5830│    5.5600│    5.6400│    5.4850
 调整后每股净资产  │         -│         -│         -│    5.2900
 净资产收益率(%)   │    1.6600│    1.2690│    0.7734│    3.1100
 每股资本公积金  │    3.0887│    3.0887│    3.0887│    3.0887
 每股未分配利润  │    0.2016│    0.1797│    0.2527│    0.2262
 营业收入(万)     │  849237.1│  561410.6│  336650.4│         -
 主营业务收入(万) │         -│         -│         -│ 1265615.1
 净利润(万)       │    5567.0│    4247.4│    2625.9│   10263.8
 营业利润(万)    │    6168.8│    4548.0│    2858.4│   11791.0
 主营业务利润(万) │         -│         -│         -│  213144.8
 投资收益(万)     │     365.1│       2.4│         -│     133.8
 审计意见     │         -│         -│         -│无保留意见
━━━━━━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━━
━━━━━━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━━
   指标\报告期   │2006-09-30│2006-06-30│2005-12-31│2004-12-31
──────────┼─────┼─────┼─────┼──────
 每股收益        │    0.0804│    0.0554│    0.1190│    0.2340
 每股收益扣除   │         -│    0.0600│    0.1070│    0.1700
 每股净资产      │    5.4000│    5.3900│    5.3340│    5.3060
 调整后每股净资产  │    5.2340│    5.1500│    5.0850│    5.1080
 净资产收益率(%)   │    1.4900│    1.0300│    2.2390│    4.4100
 每股资本公积金  │    3.0878│    3.0878│    3.0878│    3.0858
 每股未分配利润  │    0.1835│    0.1585│    0.1031│   -0.6242
 营业收入(万)     │         -│         -│         -│         -
 主营业务收入(万) │  855993.4│  553812.6│ 1145589.2│ 1336252.2
 净利润(万)       │    4837.2│    3336.8│    7189.9│   14072.7
 营业利润(万)    │    6066.2│    4208.5│    3264.9│   13362.7
 主营业务利润(万) │  147884.3│   97354.4│  188346.6│  196940.2
 投资收益(万)     │     -75.9│     -75.9│     723.7│    3668.9
 审计意见     │         -│         -│无保留意见│无保留意见
━━━━━━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━━
深康佳A最新净利润为5415.01万元,同比增加11.94%,每股收益为0.0925元,同比增加15.05%。

【资产负债简表】                                              单位:万元

代码:
#!/usr/bin/perl -w

use strict;
my $localdir="D:\\tempf10";   #!!!设定F10所在目录
opendir DH,$localdir or die "XX yours OO$!";#打开文件句柄
foreach  (readdir DH) {
        next if $_ eq "." or $_ eq "..";#不要2个.文件
        $_="$localdir\\$_";             #文件名前加全路径
       
        my %mark=('上海A股'=>'SH','深圳A股'=>'SZ','中小企业板'=>'SZ');
my ($target,$target_1)=qw (净利润.万. 指标.报告期);#!!!设定提取项
my ($code,$m,@data,@date,@newdata,@newdate,@newdata_1,@newdate_1)=();
                                                            #code是代码,$m保存取得的市场用做散列的key,@data@date存放
                                                            #提取的split之前的数据和日期,@newdate@newdata...存放提取的split之后的数据和日期
my $star="【历年简要财务指标】";    #!!!设定处理块的开头
my $end ="【资产负债简表】";            #!!!设定处理块的结尾
my @block=();                   #设定需要处理的文件块的起始和结尾以及暂时保存的数组
my $n;                          #循环控制变量
        my $bf_mark="证券类别"; #!!!取证券类别和代码需要的3个变量,不同的F10需要修改
                my $bf_code="证券代码";
                my $cn="[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]";
        open INTXT,"< $_" or die"Can't open file $_: $!\n";
                while (<INTXT>) {
                       
                chomp;
                                #print "$_\n";       测试文件读取打开
#===========================以下是取市场和代码=====================================               
            
                                         #龙讯版-提取市场和代码需用的关键字保存在$bf_mark,$bf_code
                if (/│$bf_mark │($cn+)\s+/x) {
            $m=$1;
                        #print "$mark{$m}\n"; 取得市场类别
                }
        if (/│$bf_code │ (\d{6})/x) {
                        $code=$1;
                        #print "$code\n";     #取得证券代码
                }
#===========================以上是取市场和代码======================================
               
#===========================以下是取得每股收益和日期======================================

                             
                if (/$star/../$end/) {
                   push @block,$_;
                                }
                                 }#截至此位置,while<INTXT>结束
                @data=grep {/.*$target.*/} @block;#含有每股收益的行存入@data
            @date=grep {/.*$target_1.*/} @block;#含有日期的行存入@date
               
               
                @newdata=split /\s*│\s*/,$data[0];# 分离这个行
            @newdate=split /\s*│\s*/,$date[0];# 分离日期行
                @newdata_1=split /\s*│\s*/,$data[1];# 分离第二个含有06年数据的行
            @newdate_1=split /\s*│\s*/,$date[1];# 分离第二个含有06年日期的行
      
                shift @newdata;shift @newdata_1;
                my @alldata=(@newdata,@newdata_1);
                shift @newdate;shift @newdate_1;
                my @alldate=(@newdate,@newdate_1);#@alldata和@alldate存有纯净的数据和日期行
                my ($i,%date_data,@date_data)=();
        for ($i=0;$i<=@alldata;$i++) {
                        push @date_data,$alldate[$i];
                        push @date_data,$alldata[$i];
        }
                %date_data=@date_data;#%date_data现在以日期为key,以数据为value
               
                               
      my $tbzz=(($date_data{"2007-09-30"}-$date_data{"2007-06-30"})-($date_data{"2006-09-30"}-$date_data{"2006-06-30"}))/($date_data{"2006-09-30"}-$date_data{"2006-06-30"});
                       
                       
                }

我只写到这里就写不下去了。因为出现哪个除数为0的错误。
你的代码够乱的

你把 %date_data 和 @date_data 的内容打印出来看看,应该就能找到错误了吧。


[Copy to clipboard] [ - ]
CODE:
print "$date_data{"2006-09-30"}\n";
print "$date_data{"2006-06-30"}\n";

你也可以用eval捕获

[Copy to clipboard] [ - ]
CODE:
my $res = eval { your_suspicious_code };
warn $@ if $@;

谢谢2位老师,今天要休息了,明天按照2位的指导试验下。
是很乱,不会编程,新手在起步阶段,试着用perl解决工作中的问题。
还是没弄好,不甘心啊。
%date_data,@date_data都没问题,我分解成下面的步骤找问题:
my $a=$date_data{'2007-09-30'};
my $b=$date_data{'2007-06-30'};
my $c=$date_data{'2006-09-30'};
my $d=$date_data{'2006-06-30'};
my $aa = ($a-$b);
my $bb= ($c-$d);
               
print "$a","-","$b","=","$aa\n";
print "$c","-","$d","=","$bb\n";
到目前为止都没有问题,只要走到下一步,一开始除,就报错,说除数为0......
                        my $cc= ($aa / $bb);
                        print "$cc\n";
我该怎么办?  真是隔行如隔山啊。
我用 my $res = eval {my $cc= ($aa / $bb);
                print "$cc\n"; };
       warn $@ if $@;
可以得出结果,但是为啥呢为啥呢为啥不加eval就崩溃呢?