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

最初のバージョンでは、グローバルではない置換が 1 回置換されていることがわかります (明らかに、グローバルではないため)。バージョン 2 では、コードを上から下に処理するため、最後の置換で残りの "G" がスキップされます。すべての置換を並行して行いたかったのです。どうすれば文字列でそれを達成できますか?

4

2 に答える 2

8

代わりに y (文字変換) を使用します。

 $str_rev =~ tr/ATGC/TAGC/;
于 2013-03-28T09:33:56.363 に答える
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
于 2013-03-28T10:11:59.837 に答える