String Perl:字符串到匿名数组?

String Perl:字符串到匿名数组?,string,perl,transform,anonymous-arrays,String,Perl,Transform,Anonymous Arrays,已解决-->请参见编辑7 目前我对Perl还相当陌生,正在尝试修改现有页面的一部分(在Wonderdesk中)。 页面的工作方式是从GET url获取信息,并将其解析为SQL查询 因为这是一个更大系统的一部分,所以我无法修改它周围的编码,必须在这个脚本中解决它 我进行的工作测试: $input->{help_id} = ['33450','31976']; 运行此命令时,正在生成的查询返回如下内容 从帮助id所在的表中选择*(3345031976) 代码中无法按预期工作的部分: my $

已解决-->请参见编辑7

目前我对Perl还相当陌生,正在尝试修改现有页面的一部分(在Wonderdesk中)。 页面的工作方式是从GET url获取信息,并将其解析为SQL查询

因为这是一个更大系统的一部分,所以我无法修改它周围的编码,必须在这个脚本中解决它

我进行的工作测试:

$input->{help_id} = ['33450','31976'];
运行此命令时,正在生成的查询返回如下内容

从帮助id所在的表中选择*(3345031976)

代码中无法按预期工作的部分:

my $callIDs = '33450,31450';
my @callIDs = split(/,/,$callIDs);
my $callIDsearch = \@callIDs;
$input->{help_id} = $callIDsearch;
运行此命令时,正在生成的查询返回如下内容

从help_id='3345031976'的表中选择*

我试着调试它,并使用Data::Dumper获得$callIDsearch的结果,它在我的浏览器中显示为[3345031450]

有人能给我一个如何从“123456”转换为['123',456']的提示吗

致以亲切的问候, 马塞尔

--===--

编辑:

根据要求,工作的最小代码段:

$input->{help_id} = ['123','456']
不起作用的代码:

$str = '123,456';
@ids = split(/,/,$str);
$input->{help_id} = \@ids;
--===--

编辑2:

问题来源: 代码的以下部分负责从数据库中获取正确的信息:

my $input = $IN->get_hash;
my $db = $DB->table('help_desk');
foreach (keys %$input){
    if (/^corr/ and !/-opt$/ and $input->{$_} or $input->{keyword}){
        $db = $DB->table('help_desk','correspondence');
        $input->{rs} = 'DISTINCT help_id,help_name,help_email,help_datetime,help_subject,help_website,help_category,
                       help_priority,help_status,help_emergency_flag,help_cus_id_fk,help_tech,help_attach';
       $input->{left_join} = 1;
        last;
    }
}

# Do the search
my $sth  = $db->query_sth($input);
my $hits = $db->hits;
现在,我希望能够提供多个参数,而不是提供单个参数的help_id

--===--

编辑3:

查询某物是以下两种情况之一,尚未找到:

$COMPILE{query} = __LINE__ . <<'END_OF_SUB';
sub query {
# -----------------------------------------------------------
# $obj->query($HASH or $CGI);
# ----------------------------
#   Performs a query based on the options in the hash.
#   $HASH can be a hash ref, hash or CGI object.
#
#   Returns the result of a query as fetchall_arrayref.
#
    my $self = shift;
    my $sth = $self->_query(@_) or return;
    return $sth->fetchall_arrayref;
}
END_OF_SUB

$COMPILE{query_sth} = __LINE__ . <<'END_OF_SUB';
sub query_sth {
# -----------------------------------------------------------
# $obj->query_sth($HASH or $CGI);
# --------------------------------
# Same as query but returns the sth object.
#
    shift->_query(@_)
}
END_OF_SUB
非工作代码在Condition.pm中修改的结果:

$VAR1 = [
          33450,
          31450
        ];
$VAR1 = [
          "help_id",
          "IN",
          [
            33450,
            31450
          ]
        ];
$VAR1 = [
      "cus_username",
      "=",
      "Someone"
    ];
$VAR1 = [
          "help_id",
          "=",
          "33450,31450"
        ];
$VAR1 = [
          33450,
          31976
        ];
$VAR1 = [
          "help_id",
          "IN",
          [
            33450,
            31976
          ]
        ];
在Base.pm中修改工作代码的结果:

$VAR1 = [
          33450,
          31450
        ];
$VAR1 = [
          "help_id",
          "IN",
          [
            33450,
            31450
          ]
        ];
$VAR1 = [
      "cus_username",
      "=",
      "Someone"
    ];
$VAR1 = [
          "help_id",
          "=",
          "33450,31450"
        ];
$VAR1 = [
          33450,
          31976
        ];
$VAR1 = [
          "help_id",
          "IN",
          [
            33450,
            31976
          ]
        ];
工作代码在Condition.pm中修改的结果:

$VAR1 = [
          33450,
          31450
        ];
$VAR1 = [
          "help_id",
          "IN",
          [
            33450,
            31450
          ]
        ];
$VAR1 = [
      "cus_username",
      "=",
      "Someone"
    ];
$VAR1 = [
          "help_id",
          "=",
          "33450,31450"
        ];
$VAR1 = [
          33450,
          31976
        ];
$VAR1 = [
          "help_id",
          "IN",
          [
            33450,
            31976
          ]
        ];
看起来好像值后来不知何故发生了更改:S 我对工作/非工作代码所做的更改是替换:

$input->{help_id} = ['33450','31976'];
与:

--===--

编辑7:

在阅读了所有的技巧之后,我决定重新开始,并发现通过将一些日志写入文件,我可以详细分析这个问题

我仍然不知道为什么,但它现在起作用了,使用与以前相同的方法。我认为这是我的代码中某个地方的一个输入错误/小故障/错误


很抱歉打扰了大家,但我仍然建议阿蒙将这些积分转给他,因为他的提示提供了突破。

我不确定我是否完全理解发生这种情况的原因。您的查询生成器似乎需要字符串的arrayref。您可以使用
map
来执行此操作

my $callIDs = '33450,31450';
my @callIDs = map {$_*1} split(/,/,$callIDs);
$input->{help_id} = \@callIDs;

我没有答案,但我发现了一些关键点,我们需要知道发生了什么

build\u query\u cond
Base.pm
第528行)中,数组参数将转换为
键(…)
关系:

if (ref($opts->{$field}) eq 'ARRAY' ) {
    my $add = [];
    for ( @{$opts->{$field}} ) {
        next if !defined( $_ ) or !length( $_ ) or !/\S/;
        push @$add, $_;
    }
    if ( @$add ) {
        push @ins, [$field, 'IN', $add];
    }
}
sql
Condition.pm
第181行)中的有趣位。即使存在arrayref,如果
中的
测试只包含单个元素,那么它也将简化为
=
测试

if (uc $op eq 'IN' || $op eq '=' and ref $val eq 'ARRAY') {
    if (@$val > 1) {
        $op = 'IN';
        $val = '('
            . join(',' => map !length || /\D/ ? quote($_) : $_, @$val)
            . ')';
    }
    elsif (@$val == 0) {
        ($col, $op, $val) = (qw(1 = 0));
    }
    else {
        $op  = '=';
        $val = quote($val->[0]);
    }
    push @output, "$col $op $val";
}
在这两个条件之前,插入以下代码会很有趣:

Carp::cluck(Data::Dumper::Dump(...));
其中,
..
在第一个代码段中是
$opts->{$field}
,在第二个代码段中是
$cond
。生成的堆栈跟踪将允许我们找到所有可能修改该值的子例程。要使其工作,必须在启动查询之前将以下代码放入主脚本中:

use Carp ();
use Data::Dumper;

$Data::Dumper::Useqq = 1;  # escape special characters
一旦代码被这样修改,运行工作代码和非工作代码,并用

print Dumper($result);

因此,对于您的每个代码片段,我们应该得到两个堆栈跟踪和一个结果SQL查询。

黑暗中的一个镜头。。。此代码创建了一个临时数组
@callIDs

my @callIDs = split(/,/,$callIDs);
my $callIDsearch = \@callIDs;
$input->{help_id} = $callIDsearch;
如果代码的其他部分修改了
@callIDs
,即使它被分配给
$input->{help\u id}
,也可能会导致问题。当然,它是一个词法(
my
)变量这一事实意味着对
@callid
的任何这样的更改都可能是“附近的”

您可以通过如下方式进行拆分来消除命名的临时数组:

$input->{help_id} = [ split(/,/,$callIDs) ];
这个代码应该有效

my $callIDs = '33450,31450';
$input->{help_id} = [split ",", $callIDs];
若你们的代码检测到你们的数据是你们可以使用的数字

my $callIDs = '33450,31450';
$input->{help_id} = [map 0+$_, split ',', $callIDs];
如果它以某种方式变成了数字,而您需要字符串,在这种情况下,字符串不应该是数字,而是对未来工作的建议:

my $callIDs = '33450,31450';
$input->{help_id} = [map ''.$_, split ',', $callIDs];

问题出在其他地方,因为您显示的两个代码段是等效的。这个代码有效。但是SQL是如何创建的呢?这也是我的想法,但是如果代码是等效的,那么如果我不更改正在调用的函数,那么结果为什么不是呢?问题是在创建arrayref和打印SQL之间,我们需要看到这一部分。您是否可以显示一段完整但最小的代码,以显示一个代码段有效,而另一个代码段无效?有关提示,请参见。我已添加(请参见编辑2)用于获取结果的原始最小源。如果你想隐藏代码,我必须在午饭后查找。我认为我们需要看到的部分是声明
query\u sth
的部分
split
总是返回字符串。如果我们转储元素(使用Devel::Peek),我们会看到arrayref只包含
PV
s(字符串标量)。只有Data::Dumper模块可以看到字符串看起来像一个数字,并相应地对其进行格式化。即使没有
map
,此代码也可以正常工作。问题出在其他地方。split函数已返回字符串,因此无需将匿名变量放入字符串中。你应该把单引号串起来。那就是:。。。map{qq{'${}}split…转储程序返回正确的值:$VAR1=['33450','31450'];,但它仍然不起作用expected@Master-盖伊:这样行吗<代码>$input->{help_id}=[123456]
。也许它实际上需要一个int的数组ref?请参阅我编辑的应答器使用单引号或无引号解析将返回