[已解决][求助]如何判断某patten在字符串中的位置?

[已解决][求助]如何判断某patten在字符串中的位置?

$str='NNNNNNNNNNNNNNATCGCATGNNNNNNNNNNNNNN';

我想知道第一个不是/[Nn]/且是/[ATCGatcg]/的字符和最后一个这样的字符在该字符串中的位置。

就是说,$str 前面是14个N,中间是ATCGCATG,后面又是一堆N。
我要得到第一个不是N的字符的位置,即15
和从15开始,第一个N的位置减一,即22。

如果出现NATCG以外的字符,我打算报错,所以把条件加了一个。当然,通常不会出现那种情况。
另外就是如果用正则,我就不打算加uc,所以把小写的情况也加上了。

________________________
my $str = 'NNNNNNNNNNNNNNATCGCATGNNNNNNNNNNNNNN';
if ( $str =~ /^n+([atcg]+?)n+$/i ){
    my $start = $-[1] + 1;
    my $end = $+[1];
    print "$start,$end\n";
}
else{
    print "error\n";
}

index
貌似不支持regular-expression pattern
只从'N'判断也可以,第一个不是'N'的要如何处理呢?


QUOTE:
原帖由 galaxy001 于 2008-4-12 16:31 发表
$str='NNNNNNNNNNNNNNATCGCATGNNNNNNNNNNNNNN';

我想知道第一个不是/[Nn]/且是/[ATCGatcg]/的字符和最后一个这样的字符在该字符串中的位置。

看了不下十遍
还是不理解你想说什么
你还是把测试用例以及你想要的结果贴出来这样更好理解一些
我也是在用for之前看看有没有简单的方法。
如果用for扫,是在哪一步用uc?是整个$str一起还是一个个字符地弄?
一个个取字符只能用substr吗?
最后判断时应该是直接用 eq 加 or连接ATCG四个比较,这比用正则快吧?


[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
my $str="NNNNNNNNNNNNNNATCGCATGNNNNNNNNNNNNNN";
die "Malformatted ! " unless $str =~ /^[NATCG]+$/i;
if($str =~ /([ATCG]+)/){
         print "Starting at ", $-[0] + 1,"\n";
         print "Next at $+[0]\n";
         }

#!/usr/bin/perl


use strict;
use warnings;

my $found = 0;
my @location = ();

my $string='NNNNNNNNNNNNNNATCGCATGNNNNNNNNNNNNNN';
my $test = 'ATCGatcg';

my @string = split //, $string;
my @test = split //, $test;

for my $t (0 .. $#string) {

    if (grep /$string[$t]/, @test) {
        unless ($found) {
            $found = 1;
            push @location, $t+1;
        }
    } else {
        warn "Error: $string[$t] should not be found!\n" if (uc($string[$t]) ne 'N');
        next unless $found;
        push @location, $t;
        last;
    }
}

print "$_ " for @location;


-----------

>perl -w test.pl
15 22
>Exit code: 0
大骆驼的28章看到@-了,但第5章就翻不到……
只有先用了。

perldoc怎么查它?
是不是这个?

[Copy to clipboard] [ - ]
CODE:
my $str = 'NNNNNNNNNNNNNNATCGCATGNNNNNNNNNNNNNN';
if ( $str =~ /^n+([ATCGatcg]+?)n+/i ){
    my $start = $-[1] + 1;
    my $end = $+[1];
    print "$start,$end\n";
}
else{
    print "error\n";
}



QUOTE:
原帖由 galaxy001 于 2008-4-12 20:41 发表
大骆驼的28章看到@-了,但第5章就翻不到……
只有先用了。

perldoc怎么查它?

特殊变量用 perldoc perlvar 就可以看到。