Perl:拆分管道角色BUG?

时间:2014-04-28 00:34:52

标签: regex perl split pipe

我正在制作一个BED文件,但我在拆分变量以获取个人ID方面遇到了问题。

以下是数据

fam_scz_uktr_eur_omni*UK1090_0_pca|PT-BHLS    chr15    20301669 ...

这是我的脚本(我逃脱了!)

if( $id =~ m/\|/g){
    @tempID = split "\|", $id;
    $id = pop(@tempID);
}

...

unless($id =~ m/FID.IID/ || $id =~ m/arrayId/ || $id =~ m/sampleId/){
    $orphan{$id}=$line;
}

这是孤儿哈希的输出

KEY    VALUE
S    fam_scz_uktr_eur_omni*UK1090_0_pca|PT-BHLS    chr15    20301669   ....

它返回了最后一个角色。什么给了!?

我在这里遗漏了什么吗?任何帮助表示赞赏:D

2 个答案:

答案 0 :(得分:4)

试试@tempID = split /\|/, $id;。我认为报价引起了\ |只是被解释为管道字符,所以正则表达式引擎实际上只看到管道(即交替),而不是它被转义的事实。 (即它在空字符串或空字符串上匹配。)

(或者,您可以使用"\\|",但这似乎不必要地复杂化。)

答案 1 :(得分:1)

虽然你可以使用反斜杠转义,但大多数正则表达式特殊字符在字符类中使用时会失去意义。我发现这更具可读性,无论有多少级别的解释,它的含义都是一致的;对于用"分隔的字符串,或者即使它在使用前传递给shell,也无需转义转义符。

此表达式使用以下字符类分割字符串:

@tempID = split ("[|]", $id);