【问题标题】:Perl: Splitting a Pipe Character BUG?Perl:拆分管道字符 BUG?
【发布时间】:2014-04-28 00:34:52
【问题描述】:

我正在制作 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

【问题讨论】:

  • 你是说你有臭虫?

标签: regex perl split pipe


【解决方案1】:

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

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

【讨论】:

  • 正确。 split 的第一个参数是正则表达式,而不是字符串。如果你传递一个双引号字符串,它将被插入双引号,并作为正则表达式再次插入。
【解决方案2】:

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

这个表达式使用这样一个字符类来分割字符串:

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

【讨论】:

    猜你喜欢
    • 2012-02-28
    • 1970-01-01
    • 2013-07-07
    • 2011-04-20
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    相关资源
    最近更新 更多