+ -
当前位置:首页 → 问答吧 → 本人菜鸟,看了下面longbow0 的code有些不理解,请高手指教

本人菜鸟,看了下面longbow0 的code有些不理解,请高手指教

时间:2010-07-30

来源:互联网

本帖最后由 xlli000 于 2010-07-30 10:35 编辑

首先感谢longbow0 的帮忙,学习perl中,有些不理解。

my (@first,@second,@third);

while(<DATA>)
{
        chomp;
        my @data = split;

        if($. == 1)
        {
                my $data = <DATA>;
                chomp $data;
                @first  = @data;
                @second = split(/\s/,$data);
                diff(\@first,\@second);
                print "@first\n";
        }
        else
        {
                diff(\@second,\@first);
                @third = @data;
                diff(\@second,\@third);
                print "@second\n";
                @first = @second;
                @second = @third;
        }
}
diff(\@second,\@first);
print "@second\n";

sub diff
{
        my ($up,$down) = @_;
        for my $i(0..@$up-1)
        {
                if($up->[$i] eq 'a' and $up->[$i] ne $down->[$i] and $down->[$i] ne 'b')
                {
                        $up->[$i] = 'b';
                }
        }
}

__END__
1 1 1 1 1 1 1 0 a a a
1 1 1 1 1 1 1 0 a a a
1 1 1 1 1 1 1 0 a a a
1 1 1 1 a 1 1 0 a a a
1 1 1 a a a a a a a a
1 1 1 a a a a a a a a
1 0 0 a a a a a a a a
1 0 0 a 0 a a a a a a
1 0 0 0 0 0 0 0 a a a
1 0 0 0 0 0 0 0 a a a
1 0 0 0 0 0 0 0 a a a
1 0 0 0 0 0 0 0 1 1 a
1 0 0 0 0 0 0 0 1 1 a


本人菜鸟,看了上面code没能理解,下面这些是不是简写,如果是,原文应该是什么。


        chomp;   什么意思,这是对哪个数据进行截断的操作????????
        my @data = split;  这个是对什么数据进行的split??????
        if($. == 1),    试验后发现是DATA的行号,怎么来的???

作者: xlli000   发布时间: 2010-07-30

回复 xlli000

    其实是 chomp $_;  是将$_变量中的换行符去掉
   while(<DATA>)
   my @data = split;  split后面也有一个隐藏的$_,值为读取文件的每一行。
   $. 这个就是perl中的特殊变量  没有什么好说的了  记住吧   
  讲得不对还请指正

作者: OnlyForStudy   发布时间: 2010-07-30



QUOTE:
回复  xlli000

    其实是 chomp $_;  是将$_变量中的换行符去掉
   while()
   my @data = split;  ...
OnlyForStudy 发表于 2010-07-30 10:37



谢谢,另外diff是什么意思,有返回值么,我试着去print,但print不出来。
如果有返回值,那返回值是什么,没返回值的话,在这里起什么作用。
   

diff(\@second,\@first);

作者: xlli000   发布时间: 2010-07-30