Mysql 不能通过将值从两个不同的子例程传递到新的子例程:Perl来执行计算
我使用匿名散列将值从两个不同的子例程传递到一个新的子例程。但是,现在我无法使用传递的变量执行计算Mysql 不能通过将值从两个不同的子例程传递到新的子例程:Perl来执行计算,mysql,database,perl,Mysql,Database,Perl,我使用匿名散列将值从两个不同的子例程传递到一个新的子例程。但是,现在我无法使用传递的变量执行计算 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({
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;
使用警告;
严格使用;
使用特征“说”;
使用DBI;
使用自动模具;
使用数据::转储程序;
使用CGI;
打印“输入顺序”;
我的$seq=;
chomp$seq;
$len=长度$seq;
我的$f=nuc($seq);
perc({len=>$len});
子nuc{
我的($c)=;
咀嚼$c;
my$len=长度$c;
对于(我的$i=0;$i<=$len;$i++){
my$seq2=子项($c$i,1);
$nuc=$nuc.$seq2;
咀嚼$nuc;
}
我的$l=perc({nuc=>$nuc});
}
次级perc{
我的$params=shift;
my$k=$params->{nuc};
my$w=$params->{len};
我的$db=“hnf1a”;
my$user=“root”;
我的$password=“”;
my$host=“localhost”;
my$dbh=DBI->connect(“DBI:mysql:database=$db:$host”、$user:$password);
my$sth=$dbh->prepare('SELECT COUNT(*)FROM mody,其中nm=?');
对于(1..100){
$sth->execute(整数(10兰特));
}
chomp(我的$input=$k);
my@num=split/':'/,$input;
对于我的$num(@num){
说“行匹配输入nuc:”;
$sth->execute($num);
my$count=$sth->fetchrow\u数组;
说“$count”;
$u+=$count;
}
}
$h=$u/$w;
打印$h;
我通过声明匿名散列将变量:$nuc和$len传递给最后一个子例程“perc”。
当我使用这些变量进行计算时,我没有得到正确的答案。
对于执行的上述除法,我得到一份声明称为“非法除法”
请帮帮我。提前感谢。您正在分别调用perc
,每个调用在散列中只包含一个必需的值。您不能这样做:除非您编写代码,否则子例程将不会“记住”通过不同调用传递给它的值
您需要收集所有值并在一次调用中将它们传递到perc
您正在对perc
进行两次单独的调用,每个调用在散列中只包含一个所需的值。您不能这样做:除非您编写代码,否则子例程将不会“记住”通过不同调用传递给它的值
您需要收集所有值,并在一次调用中将它们传递到
perc
这里有很多误解。让我们看看你的代码
use CGI;
使用CGI.pm有点过时,但是如果您正在编写一个CGI程序,这并不是一个糟糕的主意。但这不是一个CGI程序,所以这是没有必要的
print "Enter sequence";
my $seq = <STDIN>;
chomp $seq;
$len = length $seq;
my $f = nuc($seq);
您获取已传入的参数,并从其末尾删除换行符(它不做任何操作,因为这是已删除其换行符的$seq
)。然后获得该字符串的长度(再次!)
然后它变得很奇怪。首先,有一个语法错误(<=/code>应该是{nuc});
my$w=$params->{len};
我的$db=“hnf1a”;
my$user=“root”;
我的$password=“”;
my$host=“localhost”;
my$dbh=DBI->connect(“DBI:mysql:database=$db:$host”、$user:$password);
my$sth=$dbh->prepare('SELECT COUNT(*)FROM mody,其中nm=?');
对于(1..100){
$sth->execute(整数(10兰特));
}
chomp(我的$input=$k);
my@num=split/':'/,$input;
对于我的$num(@num){
说“行匹配输入nuc:”;
$sth->execute($num);
my$count=$sth->fetchrow\u数组;
说“$count”;
$u+=$count;
}
}
获取散列引用,该散列引用被传递到存储在$params
中。然后从该散列中提取nuc
和len
值,并将它们存储在名为$k
和$w
的变量中(您确实需要改进变量和子例程名称!)但是对perc
的每次调用都只设置了其中一个值-因此两个变量中只有一个获得值,另一个变量将是undef
然后连接到数据库。然后运行select查询一百次,传入0到9之间的随机整数。然后忽略select语句返回的值。这既奇怪又无意义
最后,您开始使用一个输入参数$k
(另一个参数$w
,被完全忽略)执行某些操作。将其复制到另一个标量变量中,然后再将其拆分为数组。然后对该数组中的每个元素运行一次相同的SQL select语句,并将返回的数字添加到$u
中的运行总数中。$u
是另一个从未声明的变量,因此(再次)此代码不会编译
在子例程之外,然后使用$u
(未声明的变量)和$w
(在不同范围内声明的变量)执行一些简单的数学运算,并将结果存储在$h
(另一个未声明的变量)中
我真的不明白这个代码应该做什么。老实说,我认为你也不明白。如果你在学校,那么你需要回到你的老师那里说你不知道你在做什么。如果你在工作,你需要告诉你的老板你不是这个任务的合适人选
无论哪种方式,如果你想成为一名程序员,你都需要回到起点,重新学习基本知识。这里有很多误解。让我们来看看你的代码
use CGI;
使用CGI.pm有点过时,但是如果你正在编写一个CGI程序,这不是一个糟糕的主意。但是这不是一个CGI程序,所以这是没有必要的
print "Enter sequence";
my $seq = <STDIN>;
chomp $seq;
$len = length $seq;
my $f = nuc($seq);
获取已传入的参数,并从其末尾删除换行符(这是已删除其换行符的$seq
,因此不起任何作用)。然后获取此字符串的长度(再次!)
首先,有一个语法错误(<=/code>应该是{nuc};
my$w=$params->{len};
我的$db=“hnf1a”;
my$user=“root”;
我的$password=“”;
my$host=“localhost”;
我的$dbh
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;
}
}