【问题标题】:Why isn't Perl's tr/// doing what I want?为什么 Perl 的 tr/// 不做我想要的?
【发布时间】:2010-10-22 08:40:45
【问题描述】:

我正在将 Perl 用于一个脚本,该脚本将输入作为两个短的 DNA 字符串。作为输出,我连接两个字符串字符串,然后在连接字符串的末尾打印第二个字符串,并在其副本上排成一行。例如:如果输入字符串是 AAAA 和 TTTTT 则打印:

AAAAATTTTT
     TTTTT

我知道还有其他方法可以做到这一点,但我很想知道为什么我使用 tr/// 不起作用。

程序的代码是:

use strict;
use warnings;
print "enter a DNA sequence \n";
$DNA1=<>; #<> shorthand for STDIN
$DNA1=~ s/\r?\n?$//;
print $DNA1 "\n\n";
print "enter second DNA sequence \n";
$DNA2=<>;
$DNA2=~ s/\r?\n?$//;
print $DNA2 "\n\n";
$DNA= join("",($DNA1,$DNA2));
print "Both DNA sequences are \"$DNA\" \n\n";
$DNA3=$DNA1;
$DNA3=~ tr/ATCGatcg//;
print $DNA3 "\n\n";
$DNA4= join("",($DNA3,$DNA2));
print $DNA4 "\n\n";
exit;

【问题讨论】:

  • 这只是格式不好还是 Perl 的语法格式实际上是这样的?
  • 不是 "$DNA1=~ s/\r?\n?$//;"和“chomp $DNA1;”一样吗?
  • 是 "$DNA1=~ s/\r?\n?$//;"与“chomp $DNA”相同。但 perl 4 及更低版本不支持 chomp,因此它是一种替代方案。我的机器安装了 perl 4。
  • @Alnitak & @Bobby - 并且,假设目标机器上的 perl 4,代码看起来不会好很多(那些严格和警告也不会做太多)。顺便说一句:找到一台运行 perl 4 的机器真的很可怕。Perl 5 是 15 年前发布的!
  • $DNA1=~s/\r?\n?$//;仅当输入记录分隔符为 \r\n 时才与 chomp 相同,但它可能不是。

标签: perl syntax perl4


【解决方案1】:

您的 tr 更改任何 ACTGatcg 并删除它们。我想你想要

$DNA3 =~ tr/atcgATCG/ /;

【讨论】:

  • 不是没有,它会计算它们(但返回的计数在此处未使用)
【解决方案2】:

您需要在tr 命令的后半部分放置一个空格。

另外,您似乎正在尝试创建一个包含与第一个字符串中的字符一样多的空格的变量:

my $spaces = ' ' x length($DNA1);

【讨论】:

    【解决方案3】:

    这可能只是一个简单的语法错误。试试:

    $DNA3 =~ tr/ATCGatcg/ /;
    

    第二个斜线分隔两个翻译实体,第二个和第三个斜线之间有一个空格字符。

    祝你好运!

    编辑:我的错误 - 误解了你想要做什么。答案相应调整:)

    【讨论】:

      【解决方案4】:

      这是你想要的程序吗?

      #!perl 我的 $s1 = 'AAAAAAAAA'; 我的 $s2 = 'TCGAGCTA'; 打印 $s1, $s2, "\n", ' ' x 长度( $s1 ), $s2, "\n";

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-20
        • 2015-11-13
        • 2012-10-23
        • 2015-05-19
        • 2021-12-21
        • 1970-01-01
        相关资源
        最近更新 更多