我正在尝试以正确的方式解决此问题: -我要说,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
有什么线索可以解决这个问题吗?
答案 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";
}