我使用匿名哈希将值从两个不同的子例程传递给新的子例程。但是,现在我无法使用传递的变量执行计算。
use warnings;
use strict;
use feature 'say';
use DBI;
use autodie;
use Data::Dumper;
use CGI;
print "Enter sequence";
my $seq = <STDIN>;
chomp $seq;
$len = length $seq;
my $f = nuc($seq);
perc({ len => $len });
sub nuc {
my ($c) = @_;
chomp $c;
my $len = length $c;
for (my $i = 0; $i< = $len; $i++) {
my $seq2 = substr($c, $i, 1);
$nuc=$nuc . $seq2;
chomp $nuc;
}
my $l = perc({nuc => $nuc});
}
sub perc {
my $params = shift;
my $k = $params->{nuc};
my $w = $params->{len};
my $db = "hnf1a";
my $user = "root";
my $password = "";
my $host = "localhost";
my $dbh = DBI->connect("DBI:mysql:database=$db:$host",$user,$password);
my $sth = $dbh->prepare('SELECT COUNT(*) FROM mody where nm = ?');
for (1..100) {
$sth->execute(int(rand(10)));
}
chomp (my $input = $k);
my @num = split /':'/, $input;
for my $num(@num) {
say "rows matching input nuc <$num>:";
$sth->execute($num);
my $count = $sth->fetchrow_array;
say "$count";
$u += $count;
}
}
$h = $u / $w;
print $h;
我将变量:$ nuc和$ len传递给最后一个子程序&perc&#39;通过声明匿名哈希。 当我使用这些变量进行计算时,我没有得到正确的答案。 对于上面所执行的部门,我得到了一个声明为“非法划分”。
请帮帮我。提前谢谢。
答案 0 :(得分:3)
您正在对perc
进行两次单独的调用,每次调用只有散列中所需的一个值。你不能那样做:子程序不会“记住”在不同的调用中传递给它的值,除非你编写代码来执行该操作
您需要收集所有值并在单调用中将其传递给perc
答案 1 :(得分:0)
这里存在很多误解。我们来看看您的代码。
use CGI;
使用CGI.pm有点过时了,但如果您正在编写CGI程序,这并不是一个糟糕的主意。但这不是CGI计划,所以这不是必需的。
print "Enter sequence";
my $seq = <STDIN>;
chomp $seq;
$len = length $seq;
my $f = nuc($seq);
这看起来不错。您提示用户,获取一些输入,从输入末尾删除换行符,获取输入的长度,然后将输入传递到nuc()
。
所以,让我们看看nuc()
- 它可能有一个更好的名字!
sub nuc {
my ($c) = @_;
chomp $c;
my $len = length $c;
for (my $i = 0; $i< = $len; $i++) {
my $seq2 = substr($c, $i, 1);
$nuc=$nuc . $seq2;
chomp $nuc;
}
my $l = perc({nuc => $nuc});
}
您获取已传入的参数并从其末尾删除换行符(由于此$seq
已删除其换行符,因此无效)。然后你得到这个字符串的长度(再次!)
然后它变得非常奇怪。首先,语法错误(< =
应为<=
)。然后你也使用C风格的循环和substr()
......好吧,基本上你只是以一种非常低效的方式将$c
复制到$nuc
。所以这个子程序可以写成:
sub nuc {
my ($c) = @_;
$nuc = $c;
my $l = perc({ nuc => $nuc });
}
哦,我不知道为什么你每次循环chomp($nuc)
。
另外两件奇怪的事情。首先,您不能在任何地方声明$nuc
,并且代码中包含use strict
。这意味着这段代码甚至无法编译。 (请不要浪费我们的时间使用无法编译的代码!)其次,您不能显式返回nuc()
的值,但是您将返回值存储在{{ 1}}。由于Perl的工作方式,此子例程将返回$f
中的值。但最好是明确的。
然后是你的$l
子程序。
perc()
您将获得在sub perc {
my $params = shift;
my $k = $params->{nuc};
my $w = $params->{len};
my $db = "hnf1a";
my $user = "root";
my $password = "";
my $host = "localhost";
my $dbh = DBI->connect("DBI:mysql:database=$db:$host",$user,$password);
my $sth = $dbh->prepare('SELECT COUNT(*) FROM mody where nm = ?');
for (1..100) {
$sth->execute(int(rand(10)));
}
chomp (my $input = $k);
my @num = split /':'/, $input;
for my $num(@num) {
say "rows matching input nuc <$num>:";
$sth->execute($num);
my $count = $sth->fetchrow_array;
say "$count";
$u += $count;
}
}
中的商店中传递的哈希引用。然后,从该哈希中提取$params
和nuc
值,并将它们存储在名为len
和$k
的变量中(您确实需要改进变量和子例程名称!)但是每次调用$w
只会设置其中一个值 - 因此只有两个变量中的一个获得值,另一个变为perc
。
然后你连接到数据库。并且您运行一个选择查询一百次,传递0到9之间的随机整数。并忽略select语句返回的值。这是奇怪而毫无意义的。
最后,您开始使用其中一个输入参数执行某些操作undef
(另一个,$k
,完全被忽略)。在将其拆分为数组之前,将其复制到另一个标量变量中。然后,对该数组中的每个元素运行一次相同的SQL select语句,并将您返回的数字添加到$w
中的运行总计中。 $u
是另一个你永远不会声明的变量,所以(再次)这段代码不会编译。
在子程序之外,然后使用$u
(未声明的变量)和$u
(在不同范围内声明的变量)执行一些简单的数学运算,并将结果存储在{{1 (另一个未声明的变量)。
我真的不明白这段代码应该做什么。而且,说实话,我不认为你也这样做。如果你在学校,那么你需要回到老师面前说你不知道自己在做什么。如果你在工作,你需要告诉你的老板你不是这个任务的合适人选。
无论哪种方式,如果你想成为一名程序员,你需要回到起点并再次涵盖基础知识。