在Perl中同时替换

时间:2013-03-28 09:24:19

标签: string perl global substitution

下面是一个脚本,我试图反转然后替换(A => T,T => A,G => C,C => G)。

版本1

#!/usr/bin/perl    
my $str="AAAAAGCTTGC";
$str_rev=scalar reverse ("$str"),"\n";
print"My original string: $str\n";
print "My reversed string: $str_rev\n";

$str_rev =~ s/A/T/g;
$str_rev =~ s/T/A/;
$str_rev =~ s/G/C/g;
$str_rev =~ s/C/G/;
print"My substituted reversed string: $str_rev\n";

输出:

My original string: AAAAAGCTTGC
My reversed string: CGTTCGAAAAA
My substituted reversed string: GCATCCTTTTT

所有替换的全球(第2版)

$str_rev =~ s/A/T/g;
$str_rev =~ s/T/A/g;
$str_rev =~ s/G/C/g;
$str_rev =~ s/C/G/g;
print"My substituted reversed string: $str_rev\n";

输出:

My original string: AAAAAGCTTGC
My reversed string: CGTTCGAAAAA
My substituted reversed string: GGAAGGAAAAA

在第一个版本中,我观察到非全局的替换被替换一次(显然,因为它不是全局的)。在版本2中,由于它从上到下处理代码,因此最后一次替换会跳过剩余的“G”。我希望所有的替换都是并行的。我怎样才能在字符串中实现它?

2 个答案:

答案 0 :(得分:8)

改为使用y(音译):

 $str_rev =~ tr/ATGC/TAGC/;

答案 1 :(得分:0)

如果你有use strictuse warnings,你就会看到警告

Useless use of a constant ("\n") in void context

参考这一行

$str_rev=scalar reverse ("$str"),"\n";

除了翻转字符串之外,我不明白你在这里要做什么。什么是迷路换行符?此外,scalar是多余的,将变量放在双引号中是错误的(尽管在这种情况下这些错误都不会影响您的程序)。这应该写成

my $str_rev = reverse $str;

以下是显示正确代码并使用s///代替tr///的解决方案。除了修复之外,这是为了您的兴趣,因为最好使用音译。

use strict;
use warnings;
use 5.014;

my $str = "AAAAAGCTTGC";

print "My original string: $str\n";

my %map =  ( A => 'T', T => 'A', G => 'C', C => 'G' );
my $str_rev = reverse $str =~ s/([ATGC])/$map{$1}/gr;

print "My substituted reversed string: $str_rev\n";

<强>输出

My original string: AAAAAGCTTGC
My substituted reversed string: GCAAGCTTTTT