0

下面是我试图反转然后替换的脚本(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”。我想要所有的替换并行。我怎样才能在字符串中实现这一点?

4

2 回答 2

8

改用 y(音译):

 $str_rev =~ tr/ATGC/TAGC/;
于 2013-03-28T09:33:56.363 回答
0

如果你有use strict并且use 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
于 2013-03-28T10:11:59.837 回答