【问题标题】:Joining two strings by matching positions of alphabet in both strings in Perl通过匹配 Perl 中两个字符串中的字母位置来连接两个字符串
【发布时间】:2012-09-28 07:38:02
【问题描述】:

我正在尝试编写一个 Perl 脚本,其中字符串在每次出现“E”时以及当用户通过命令行输入“C”的位置时(比如 3-8 或 3-8,13-18 或任何如果字符串很长,则根据这种格式的字符串用逗号分隔 'C' 的这些位置),包含 'C' 的片段(例如在 3 和 8 位置)应连接并显示在输出中。假设字符串是 "ABCDEABCDEABCDEABCDEABCDE" 用户输入 3-8 那么程序输出应该是-

ABCDEABCDE
ABCDE
ABCDE
ABCDE

我编写了一个脚本,用户通过命令行输入“C”位置,字符串在“E”的每个位置被剪切,但之后我无法正确编写它。请帮忙!

到目前为止我编写的代码(已编辑)是:

use strict;
use warnings;

my $s = 'ABCDEABCDEABCDEABCDEABCDE';
my $i=0;
my @where;
my @array;
my @bond;
my @pos;
my @s_array;
my @s_array2;

for ($i=0; $i<=4; $i++) {
    $where[$i] = index($s,"C",$where[$i-1])+1;
    push(@array,$where[$i]);
}
print "All Positions of C: @array\n\n";
print "Enter C positions:\n";
my @join_C = <STDIN>; 

foreach (@join_C) {
    @bond = split (',',$_);
}

foreach (@bond) {
    @pos = split ('-', $_);
}
print "entered C positions:@pos\n";
print "Resulting disulfide linked peptides\n\n";
my @a = split(/E/, $s); 
my $result = join ("E,", @a);
my @final = split(/,/, $result);
foreach my $final (@final) {
    foreach my $pos(@pos) {
        my @source = split //, $final[@final];
        my $length = @source;
        for ($i=0; $i<=$length; $i++) {
            if (index($final[$i], "C") == $pos[$i]) {
                push (@s_array, $final[$i]);
            }
            else {
                push (@s_array2, $final[$i]);
            }
        }
    }
}
my $lastly_joined = join (',', @s_array);
print "Joined Fragments= @s_array\n";
print "Remaining fragments= @s_array2\n";

【问题讨论】:

  • 1st- 你的代码中的@join_C 是什么? codepad.org/3AjVLHhq 你能在这里把 $line 设置为从标准输入输入的字符串吗?
  • @eicto : join_C 是一个数组,其中存储了用户输入的用于组合字符串的“C”的所有位置。
  • 但是如何在代码中使用它?
  • @eicto :抱歉,我想不通。我的想法是在每个“E”处打破以匹配用户输入的“C”的每个位置与原始字符串中的位置。如果匹配,则两个相应的字符串将显示为在输出中连接。但我无法正确编码。请帮忙!
  • 您是否编写了您试图解决的代码?这是一些家庭作业?

标签: string perl


【解决方案1】:

我会尝试了解您想要做什么。

我正在尝试编写一个 Perl 脚本,其中字符串在每个 'E'的出现

好的,首先创建输入。让我们使用一个数组来访问 元素更容易。

my @s = split ('', 'ABCDE' x 5);

我不确定该字符串在您的情况下看起来如何。你能提供一个 现实世界的例子。

当用户通过命令行输入 'C' 的 c_pos 时(比如 3-8 或 3-8,13-18 或任何逗号分隔 'C' 的此类 c_pos 根据 如果字符串很长,则采用这种格式的字符串)

我建议使用命令行参数。这使得它更容易使用 稍后在与其他工具的链中编写脚本。将参数传递给脚本:

script.pl 3-8,13-18

所以我们得到了一个配对列表:

my @pairs = split (',', join('', @ARGV));

现在您应该检查传递的值是否指向“C”。有效组合 存储在散列中,其中键是开始索引,值是结束 指数。

my %c_pos; 
foreach my $pair (@pairs) {
   my ($from, $to) = split('-', $pair);
   if (($string[$from-1] eq 'C') && ($string[$to-1] eq 'C')) {
      $c_pos{$from-1} = $to-1;
   } else {
      warn "position ${from}-${to} not valid => ignored!\n";
   }
}

应加入包含“C”的片段(例如在 3 和 8 位) 并显示在输出中。

现在我们可以迭代@s 的元素。当我们达到起始索引时 一个“连接”开始,这个连接一直有效,直到结束 到达。

我们将所有值存储到当前条目中。

当我们点击“E”并且我们不在“连接”中时,当前条目是 推送到我们的结果,然后我们从下一个空条目开始。

for (my $i=0; $i<@string; $i++) {

   if ($c_pos{$i}) {
       $inside_connection = 1;
       $end = $c_pos{$i}; 
   } elsif ($i == $end) {
       $inside_connection = 0;
       $end = 0;
   }

   $entry.=$string[$i];

   if ($inside_connection) {
      # do not split on 'E'
   } elsif ($string[$i] eq 'E') {
      # split on 'E'
      push @result, $entry;
      $entry = '';
   }
} 

因为我不太清楚,所以我假设像这样的链式连接 3-8, 8-13 将导致它像您所说的 3-13 一样工作。希望 适合。这是完整的脚本:

use strict;
use warnings;

my @string = split ('', 'ABCDE' x 5);       

my @pairs = split (',', join('', @ARGV));   

my %c_pos; 
foreach my $pair (@pairs) {
   my ($from, $to) = split('-', $pair);
   if (($string[$from-1] eq 'C') && ($string[$to-1] eq 'C')) {
      $c_pos{$from-1} = $to-1;
   } else {
      warn "position ${from}-${to} not valid => ignored!\n";
   }
}

my @result;
my $entry = '';
my $inside_connection = 0;
my $end=0;

for (my $i=0; $i<@string; $i++) {

   if ($c_pos{$i}) {
       $inside_connection = 1;
       $end = $c_pos{$i}; 
   } elsif ($i == $end) {
       $inside_connection = 0;
       $end = 0;
   }

   $entry.=$string[$i];

   if ($inside_connection) {
      # do not split on 'E'
   } elsif ($string[$i] eq 'E') {
      # split on 'E'
      push @result, $entry;
      $entry = '';
   }
} 

print join ("\n", @result);

【讨论】:

    猜你喜欢
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2017-01-28
    相关资源
    最近更新 更多