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

时间:2018-10-14 00:50:29

标签: perl

我正在尝试以正确的方式解决此问题: -我要说,n个元素数组作为子例程的参数。对于每个元素,匹配两个字符类型 S T 并为每个元素打印这些字母的计数。到目前为止,我做到了,但是我被锁定了,并在我的代码中发现了一些无限循环。

使用严格; 使用警告;

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 :(得分: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++;
}   

还要注意,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";

在字符串之外执行操作的地方。

答案 1 :(得分:0)

为什么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";
    }
}

答案 2 :(得分:0)

请勿使用while遍历数组-数组不会变小,因此条件始终为true,并且会遇到无限循环。您应该改用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";
}