指定字符提取

指定字符提取

如果我有多行不同长度的字母
AJAJSFLSJLFZLKLSFDWQDSEWEWEFLFMWEFLWEFMWLEFWELS
S
JKPUHNJKYHSUJCLKOEWPML

现在我要搜索每行中字母S,每当出现S就把S的位置,以及左边6个字母和右边6个字母打出来.如果那个6个字母里有空缺的,就用Z打出.

比如第一行里,第一个S在第5位,就打:
5 ZZAJAJSFLSJLF   //这里Z就是补空缺的
对于第二行的,只有一个S,就打
1 ZZZZZZSZZZZZZ
请问如何实现?
方案一:通过 regexp 找到 S 的位置,然后用 substr 提取你需要的子串
方案二:通过把要查找的字符串转换为字符数组,然后遍历该数组。

显然方案一较好


[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl -w
use warnings;
use strict;

while (<DATA>) {
    chomp;
    my $pos = index $_, "S";

    my $left;
    my $right;
    my $substr;

    if ($pos >= 0) {
        $substr = substr $_, ($pos+1)-6 <= 0 ? 0 : $pos-6, $pos > 6 ? 13 : $pos+1+6;

        $left = $pos < 6 ? "Z"x(6-$pos) : "";
        $right = length($_) - ($pos+1) < 6 ? "Z"x(6-(length($_)-($pos+1))) : "";
    } else {
        $substr = "-";
        $left = "Z" x 6;
        $right = "Z" x 6;
    }

    printf "%-3d%s%s%s%s\n", $pos+1, " ", $left, $substr, $right;
}

__DATA__
AJAJSFLSJLFZLKLSFDWQDSEWEWEFLFMWEFLWEFMWLEFWELS
S
JKPUHNJKYHSUJCLKOEWPML
JKPUHSJKYH
aKPUHSJKYHbb
aKPUHSJKYHg
dasdfasdff
gaKPUHSJKYHg
dasdfasdff
gaKPUHSJKYHgg
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaS

index 这个函数好。另外,补 Z 这个也可以通过 printf 实现。
正则表达式虽然强大,但有些问题上,用字符串函数更好