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;
  }
}