Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 查找连续范围并将值传递出if循环_Perl - Fatal编程技术网

Perl 查找连续范围并将值传递出if循环

Perl 查找连续范围并将值传递出if循环,perl,Perl,我想找到一个所有值都大于0.3的连续范围。比如说 A 1 10 0.2 A 20 40 0.4 A 60 75 0.5 A 90 100 0.55 A 200 205 0.43 A 211 270 0.8 A 450 511 0.1 A 513 550 0.0 B 1 10 0.6 B 50 200 0.7 B 300 350 0.8 B 400 500 0.9 B 600 711 0.4 B 800 900 0.2

我想找到一个所有值都大于0.3的连续范围。比如说

A   1   10  0.2
A   20  40  0.4
A   60  75  0.5
A   90  100 0.55
A   200 205 0.43
A   211 270 0.8
A   450 511 0.1
A   513 550 0.0
B   1   10  0.6
B   50  200 0.7
B   300 350 0.8
B   400 500 0.9
B   600 711 0.4
B   800 900 0.2
输出:

A   20  270
B   1   711
我试过:

while(<>){
        chomp($_);
        my @line = split("\t| ", $_);
        my $letter=$line[0];
        my @start;
        my @end;
                if($line[3]>0.3){
                        push (@start, $line[1]);
                        push (@end, $line[2]);

                        }
                if($line[3]<0.3){
                        next;}
                print $letter,"\t",$start[0],"\t",$end[-1],"\n";
                }

但是我只想要每个适当范围的第一个开始和最后一个结束

你没有说你是想要第一个字母还是最后一个字母(或者如果你想把字母的变化当作一个范围的结束),所以我只做第一个

my $in_range;
my @ranges;
while (<>) {
    chomp;
    my ($letter, $start, $end, $value) = split /\t| /, $_;
    if ($value <= .3) {
        $in_range = undef;
    }
    elsif ($in_range) {
        $in_range->{'end'} = $end;
        push @{ $in_range->{'values'} }, $value;
    }
    else {
        $in_range = {
            'letter' => $letter,
            'start' => $start,
            'end' => $end,
            'values' => [ $value ],
        };
        push @ranges, $in_range;
    }
}

for my $range (@ranges) {
    print join( "\t",
        @$range{ qw/letter start end/ },
        scalar( @{ $range->{'values'} } ),
        join( ',', @{ $range->{'values'} } )
    ), "\n";
}
my$在\u范围内;
我的@ranges;
而(){
咀嚼;
我的($letter,$start,$end,$value)=拆分/\t |/,$;
如果($value{'end'}=$end;
push@{$in_range->{'values'},$value;
}
否则{
$in_范围={
“字母”=>美元字母,
“开始”=>$start,
'end'=>end美元,
“值”=>[$value],
};
按@范围,$在_范围内;
}
}
对于我的$range(@ranges){
打印连接(“\t”,
@$range{qw/字母开始/结束/},
标量(@{$range->{'values'}}),
联接(“,”,@{$range->{'values'})
),“\n”;
}

(根据注释更新以显示值)

您没有说是要第一个字母还是最后一个字母(或者如果您想将字母更改视为范围的结尾),所以我只做第一个

my $in_range;
my @ranges;
while (<>) {
    chomp;
    my ($letter, $start, $end, $value) = split /\t| /, $_;
    if ($value <= .3) {
        $in_range = undef;
    }
    elsif ($in_range) {
        $in_range->{'end'} = $end;
        push @{ $in_range->{'values'} }, $value;
    }
    else {
        $in_range = {
            'letter' => $letter,
            'start' => $start,
            'end' => $end,
            'values' => [ $value ],
        };
        push @ranges, $in_range;
    }
}

for my $range (@ranges) {
    print join( "\t",
        @$range{ qw/letter start end/ },
        scalar( @{ $range->{'values'} } ),
        join( ',', @{ $range->{'values'} } )
    ), "\n";
}
my$在\u范围内;
我的@ranges;
而(){
咀嚼;
我的($letter,$start,$end,$value)=拆分/\t |/,$;
如果($value{'end'}=$end;
push@{$in_range->{'values'},$value;
}
否则{
$in_范围={
“字母”=>美元字母,
“开始”=>$start,
'end'=>end美元,
“值”=>[$value],
};
按@范围,$在_范围内;
}
}
对于我的$range(@ranges){
打印连接(“\t”,
@$range{qw/字母开始/结束/},
标量(@{$range->{'values'}}),
联接(“,”,@{$range->{'values'})
),“\n”;
}

(根据注释更新以显示值)

使用散列怎么样

#!/usr/bin/perl

use strict;
use warnings;

my %values;
while (<>) {
    chomp;
    my ($letter, $start, $end, $val) = split "\t| ";

    next if (defined $values{$letter}{skip_rest});

    if ($val > 0.3) {
        $values{$letter}{min} = $start
            if not defined $values{$letter}{min} or $values{$letter}{min} > $start;
        $values{$letter}{max} = $end
            if not defined $values{$letter}{max} or $values{$letter}{max} < $end;
    }
    elsif (defined $values{$letter}{min} and defined $values{$letter}{max}) {
        $values{$letter}{skip_rest} = "true";
    }
}

foreach my $letter (sort keys %values) {
    print "$letter\t$values{$letter}{min}\t$values{$letter}{max}\n";
}
!/usr/bin/perl
严格使用;
使用警告;
我的%价值观;
而(){
咀嚼;
我的($letter,$start,$end,$val)=拆分“\t|”;
下一个if(定义的$values{$letter}{skip_rest});
如果($val>0.3){
$values{$letter}{min}=$start
如果未定义$values{$letter}{min}或$values{$letter}{min}>$start;
$values{$letter}{max}=$end
如果未定义$values{$letter}{max}或$values{$letter}{max}<$end;
}
elsif(定义的$values{$letter}{min}和定义的$values{$letter}{max}){
$values{$letter}{skip_rest}=“true”;
}
}
foreach my$字母(排序键%value){
打印“$letter\t$values{$letter}{min}\t$values{$letter}{max}\n”;
}

使用散列怎么样

#!/usr/bin/perl

use strict;
use warnings;

my %values;
while (<>) {
    chomp;
    my ($letter, $start, $end, $val) = split "\t| ";

    next if (defined $values{$letter}{skip_rest});

    if ($val > 0.3) {
        $values{$letter}{min} = $start
            if not defined $values{$letter}{min} or $values{$letter}{min} > $start;
        $values{$letter}{max} = $end
            if not defined $values{$letter}{max} or $values{$letter}{max} < $end;
    }
    elsif (defined $values{$letter}{min} and defined $values{$letter}{max}) {
        $values{$letter}{skip_rest} = "true";
    }
}

foreach my $letter (sort keys %values) {
    print "$letter\t$values{$letter}{min}\t$values{$letter}{max}\n";
}
!/usr/bin/perl
严格使用;
使用警告;
我的%价值观;
而(){
咀嚼;
我的($letter,$start,$end,$val)=拆分“\t|”;
下一个if(定义的$values{$letter}{skip_rest});
如果($val>0.3){
$values{$letter}{min}=$start
如果未定义$values{$letter}{min}或$values{$letter}{min}>$start;
$values{$letter}{max}=$end
如果未定义$values{$letter}{max}或$values{$letter}{max}<$end;
}
elsif(定义的$values{$letter}{min}和定义的$values{$letter}{max}){
$values{$letter}{skip_rest}=“true”;
}
}
foreach my$字母(排序键%value){
打印“$letter\t$values{$letter}{min}\t$values{$letter}{max}\n”;
}

如果不清楚,很抱歉。我想打印包含值超过0.3的范围的开始和结束。提示:
拆分(''',$)
(可以写为
拆分
),在whitepsace上拆分。如果不清楚,很抱歉。我想打印包含值超过0.3的范围的开始和结束。提示:
拆分(',$)
(可以写成
split
),在whitepsace上拆分。不检查连续范围谢谢@ysth,不知道我是怎么漏掉的:PDOS不检查连续范围谢谢@ysth,不知道我是怎么漏掉的:Phow可以放一个计数器来显示我们在一个连续范围内分组了多少个值,还可以显示值。例如“a 20 270 5 0.4,0.5,0.55,0.43,0.8”如何放置计数器以显示我们在一个连续范围内分组的数值,并显示数值。例如“a 20 270 5 0.4,0.5,0.55,0.43,0.8”