将字符串作为数组传递给子例程并返回特定字符的计数

tav*_*ndo 0 perl

我试图以正确的方式思考解决这个问题: - 我会将说明,n个元素数组作为参数传递给子程序.并且为每个元素匹配两个char类型ST并为每个元素打印,这些字母的计数.到目前为止,我做了这个,但我被锁定,并在我的代码中发现了一些无限循环.

用严格; 使用警告;

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);
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

Element 1 Counts of ST = 5
Element 2 Counts of ST = 6
Element 3 Counts of ST = 4
Run Code Online (Sandbox Code Playgroud)

任何线索如何解决这个问题?

Chr*_*ley 7

关于你的问题的一些评论.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++;
}   
Run Code Online (Sandbox Code Playgroud)

另外,请注意,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
Run Code Online (Sandbox Code Playgroud)

此外,您不能像引用的那样在带引号的字符串中执行数学运算.

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

相反,你需要做:

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

操作在字符串之外执行的位置.