下面是一个脚本,我试图反转然后替换(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”。我希望所有的替换都是并行的。我怎样才能在字符串中实现它?
答案 0 :(得分:8)
改为使用y(音译):
$str_rev =~ tr/ATGC/TAGC/;
答案 1 :(得分: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