Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中,将一个参数传递到一个子例程中,该子例程也是一个参数_Perl - Fatal编程技术网

在Perl中,将一个参数传递到一个子例程中,该子例程也是一个参数

在Perl中,将一个参数传递到一个子例程中,该子例程也是一个参数,perl,Perl,所以我的问题是基于这个问题: 问题是:我可以将参数/参数传递到子例程(它本身也是一个参数)中吗 有可能这样做吗 $question_subref->($PassSomethingHere,$SomethingElse) 以下是实际代码: my $SelectResults = sub { my @results; $sql = $_[0]; $sth = $_[1]; $sql =~ s/sele

所以我的问题是基于这个问题:

问题是:我可以将参数/参数传递到子例程(它本身也是一个参数)中吗

有可能这样做吗

$question_subref->($PassSomethingHere,$SomethingElse


以下是实际代码:

my $SelectResults = sub {
            my @results;
            $sql = $_[0];
            $sth = $_[1];
            $sql =~ s/select/SELECT/gi;
            if(StrContains($sql, "SELECT"))
            {
                @results= $sth->fetchrow_array();
                foreach my $tab (@results) {
                    print $tab . "\n";
                }
            }
            return @results;
        };



sub MySQLExe
{
    my @results;

    my $db = "fake";
    my $usr = "user";
    my $pw = "password";

    $db_handle = DBI->connect("dbi:mysql:database=$db;mysql_socket=/var/lib/mysql/mysql.sock;", $usr, $pw) \
        or die "Connection Error: $DBI::errstr \n";
    my $sql = $_[0];
    print $sql . "\n";



    #Prepare SQL query
    my $sth = $db_handle->prepare($sql)
        or die "Couldn't prepare query '$sql': $DBI::errstr\n";



    $sth->execute
        or die "Couldn't execute query '$sql': $DBI::errstr\n";


    # I can't seem to get this to work...   
    # optional Function here - get rows from select statement or something else.
    # pass in the function holder as the second parameter
    my $Func = $_[1];
    @results = $Func -> ($sql, $sth);


    #disconnect  from database
    $sth->finish;
    $db_handle->disconnect or warn "Disconnection error: $DBI::errstr \n";


    return(@results);
}
和实际使用情况:

my @tables = MySQLExe("SELECT table_name FROM information_schema.tables where table_schema='$table';", 
    $SelectResults);

正如在对相关问题的回答中所暗示的,您可能想要的是a(另请参见,):

sub-make\u提问者{
我的($text)=@;
返回接头{
我的($礼貌)=@;
打印$text、$polience、“\n”;
我的答案=;
咀嚼$answer;
$answer;
};
}
my$questioner=make_questioner(“你叫什么名字”);
我的$name=$questioner->('请');
打印“您的名字是“$name”。\n”;

您会注意到,这里的演示代码包含了创建闭包时传递的信息,还使用了传递给闭包的参数。

正如链接问题的答案所暗示的,您可能想要的是(另请参见,):

sub-make\u提问者{
我的($text)=@;
返回接头{
我的($礼貌)=@;
打印$text、$polience、“\n”;
我的答案=;
咀嚼$answer;
$answer;
};
}
my$questioner=make_questioner(“你叫什么名字”);
我的$name=$questioner->('请');
打印“您的名字是“$name”。\n”;


您会注意到,这里的演示代码包含了创建闭包时传递的信息,并且还使用了传递给闭包的参数。

实际应用程序只是将更改传递到dbi->mysql子例程中。我希望所有的连接打开和关闭的东西总是一样的,永远不会改变。但是我想要我的sql语句和一个返回结果数组(有时)的函数。如果函数可以根据应用程序做不同的事情,那就很方便了,但我似乎找不到解决方法。你有什么问题?注入错误
“SELECT…WHERE table_schema='$table';”
应该是
“SELECT…WHERE table_schema=“.$dbh->quote($table)
@Ed.,最好不要隐藏错误,这样可以解决它。您的代码混合了许多不同的样式,特别是在命名变量和函数方面。看起来您并不是自己编写的,而是从多个来源继承并编辑或复制/粘贴的。你确定你知道你想要完成什么吗?你能解释一下你为什么要这样做吗?这似乎太复杂了。如果您解释最终要解决的问题,我们可能会帮助您找到一种更简单的方法。实际应用程序只是将更改传递到dbi->mysql子例程中。我希望所有的连接打开和关闭的东西总是一样的,永远不会改变。但是我想要我的sql语句和一个返回结果数组(有时)的函数。如果函数可以根据应用程序做不同的事情,那就很方便了,但我似乎找不到解决方法。你有什么问题?注入错误
“SELECT…WHERE table_schema='$table';”
应该是
“SELECT…WHERE table_schema=“.$dbh->quote($table)
@Ed.,最好不要隐藏错误,这样可以解决它。您的代码混合了许多不同的样式,特别是在命名变量和函数方面。看起来您并不是自己编写的,而是从多个来源继承并编辑或复制/粘贴的。你确定你知道你想要完成什么吗?你能解释一下你为什么要这样做吗?这似乎太复杂了。如果你解释你最终要解决的问题,我们可能会帮助你找到一个更简单的方法。让我们在他们跑之前让OP走一走?我仍然不明白他们想做什么。当我读到问题的标题时,我立刻想到了咖喱,但我认为这并不是他们真正想要的。代码太乱了,我现在正在检查。您可能还希望包含一个指向闭包的wiki链接。这可能比Perl中的refcount更容易理解。好主意。将使用perlfaq7答案而不是perlref位。@simbabque在这里完全相同——但后来我读到他们在问题下方的评论并想到“结束”。我完全同意一个好的、脚踏实地的解释会有帮助(帮助他们行走)。谢谢,是的,我正在寻找一个终结点。让我们在他们逃跑之前进行一次行动吧?我仍然不明白他们想做什么。当我读到问题的标题时,我立刻想到了咖喱,但我认为这并不是他们真正想要的。代码太乱了,我现在正在检查。您可能还希望包含一个指向闭包的wiki链接。这可能比Perl中的refcount更容易理解。好主意。将使用perlfaq7答案而不是perlref位。@simbabque在这里完全一样——但后来我读了他们在问题下方的评论并想到了“结束”。我完全同意一个好的、脚踏实地的解释会有帮助(帮助他们行走)。谢谢,是的,结束是我想要的。
my @tables = MySQLExe("SELECT table_name FROM information_schema.tables where table_schema='$table';", 
    $SelectResults);
sub make_questioner {
  my ($text) = @_;
  return sub {
    my ($politeness) = @_;
    print $text, $politeness, "\n";
    my $answer = <>;
    chomp $answer;
    $answer;
  };
}

my $questioner = make_questioner("What... is your name");

my $name = $questioner->(', please');
print "Your name is '$name'.\n";