Передача строк в виде массива в подпрограмму и возвращение количества определенных символов - PullRequest
0 голосов
/ 14 октября 2018

Я пытался придумать правильный способ решения этой проблемы: -Я хотел бы передать, скажем, массив n элементов в качестве аргумента подпрограмме.И для каждого элемента сопоставьте два типа символов S и T и напечатайте для каждого элемента количество этих букв.Пока что я это сделал, но я заблокирован и обнаружил в своем коде бесконечные циклы.

use strict;используйте предупреждения;

sub main {

my @array = @_;

while (@array) {
    my $s = ($_ = tr/S//);
    my $t = ($_ = tr/T//);
    print "ST are in total $s + $t\n";
    }
}

my @bunchOfdata = ("QQQRRRRSCCTTTS", "ZZZSTTKQSST", "ZBQLDKSSSS");
main(@bunchOfdata);

Я хотел бы, чтобы вывод был:

Element 1 Counts of ST = 5
Element 2 Counts of ST = 6
Element 3 Counts of ST = 4

Любая подсказка, как решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 14 октября 2018

Несколько комментариев на ваш вопрос.Программы на Perl едва ли определяют main() как подпрограмму.Это подход Python.

while (@array) будет бесконечным циклом, поскольку @array никогда не становится меньше.Вы не можете читать переменную по умолчанию $_ таким образом.Чтобы это работало, используйте for (@array), который будет считывать элементы массива в $_ по одному, пока все не будут прочитаны.

Оператор транслитерации tr является правильным инструментом для вашей задачи.

Код, необходимый для получения результатов, может быть:

#!/usr/bin/perl
use strict;
use warnings;

my @data = ("QQQRRRRSCCTTTS", "ZZZSTTKQSST", "ZBQLDKSSSS");

my $i = 1;

for (@data) {
    my $count = tr/ST//;
    print "Element $i Counts of ST = $count\n";
    $i++;
}   

Также обратите внимание, что my $count = tr/ST//; не требует привязки оператора транслитерации с $_.Perl предполагает это, когда $_ содержит значение для подсчета здесь.Ваш код пробовал my $s = ($_ = tr/S//);, который даст результаты, но более короткий путь, который я показал, является предпочтительным.

(Только что заметил, что в вашем утверждении было = вместо =~.ошибка. Должно быть $s = ($_ =~ tr/S//);)

Вы можете объединить 2 искомые буквы, как в моем коде.Нет необходимости делать их отдельно.

Я получил нужный вывод.

Element 1 Counts of ST = 5
Element 2 Counts of ST = 6
Element 3 Counts of ST = 4

Кроме того, вы не можете выполнять математические операции в строке в кавычках, как у вас.

print "ST are in total $s + $t\n";

Вместо этого вам нужно будет:

print "ST are in total ", $s + $t, "\n";

, где операция выполняется вне строки.

0 голосов
/ 14 октября 2018

Не используйте while для обхода массива - ваш массив становится не меньше, поэтому условие всегда выполняется, и вы получаете бесконечный цикл.Вместо этого следует использовать for (или foreach).

for (@array) {
  my $s = tr/S//; # No need for =~ as tr/// works on $_ by default
  my $t = tr/T//;
  print "ST are in total $s + $t\n";
}
0 голосов
/ 14 октября 2018

Почему tr/// ??

sub main {
    my @array = @_;

    while (@array) {
        my $s = split(/S/, $_, -1) - 1;
        my $t = split(/T/, $_, -1) - 1;
        print "ST are in total $s + $t\n";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...