perl 中是否允许使用单个元素列表?
Are single element lists allowed in perl?
我正在尝试从 AJAX 请求(使用 Catalyst)动态创建值列表,如下所示:
my @listofvalues = @{$params->{parameter_with_many_values}};
然后我遍历列表以进行数据库插入(每个值一个)。因为我需要像上面那样遍历各种列表,所以我需要访问列表的索引。我目前是这样做的:
foreach my $key (0 .. $#listofvalues){
$table_model->new({
field1 => $listofvalues[$key],
field2 => $x,
field3 => $another_listofvalues[$key]
field4 => $yet_another_listofvalues[$key]
});
}
当在请求中收到 两个或更多 元素时,这似乎工作正常。每当收到单个元素时,我都会收到类似
的错误
[error] Caught exception in pbitdb::Controller::Subjects->add "Can't use string ("1") as an ARRAY ref while "strict refs" in use at /home/lioneluranl/svn/pbitdb/pbitdb/script/../lib/pbitdb/Controller/Subjects.pm line 119."
在这种情况下,1 是收到的值,119 行 是声明@listofvalues 的行。
现在我已经尝试了几种方法来解决这个问题,但还没有找到任何可以同时工作的方法(对于单个值或多个值)。有什么建议吗?
首先,你问的是数组(一种变量),而不是列表(一个模糊的术语,可以有多种定义,none 其中的定义在这里是相关的)。
是的,你可以有一个只有一个元素的数组。
$ perl -e'my @a = "ele"; CORE::say 0+@a; CORE::say for @a;'
1
ele
这不是问题所在。问题是
@{$params->{parameter_with_many_values}}
预计
$params->{parameter_with_many_values}
包含对数组的引用,但它包含 1
。它可能是使用
设置的
$params->{parameter_with_many_values} = @a; # Assigns number of elements
而不是
$params->{parameter_with_many_values} = \@a;
是的,单个元素列表在 Perl 中是可以的,数组和对此类数组的引用也是如此。
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
sub new {
print Dumper \@_;
}
my $table_model = 'main';
for my $values ( [ 'a' .. 'c' ],
[ 'd' ]
) {
my $params = { parameter_with_many_values => $values };
my @listofvalues = @{ $params->{parameter_with_many_values} };
my @another_listofvalues = map uc, @listofvalues;
for my $key (0 .. $#listofvalues) {
my $x = rand;
$table_model->new({
field1 => $listofvalues[$key],
field2 => $x,
field3 => $another_listofvalues[$key]
});
}
}
如何填充 $params->{parameter_with_many_values}
?
更新
看来Catalyst::Request应该提到他们的"safe"参数应该按如下方式处理:
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
for my $params ( { param_with_many_values => 'a' },
{ param_with_many_values => [ 'a' .. 'e' ] },
{ something => 'else' }
) {
my $value_or_values = $params->{param_with_many_values};
my @list_of_values = ref $value_or_values ? @$value_or_values
: defined $value_or_values ? $value_or_values
: ();
print Dumper \@list_of_values;
}
我正在尝试从 AJAX 请求(使用 Catalyst)动态创建值列表,如下所示:
my @listofvalues = @{$params->{parameter_with_many_values}};
然后我遍历列表以进行数据库插入(每个值一个)。因为我需要像上面那样遍历各种列表,所以我需要访问列表的索引。我目前是这样做的:
foreach my $key (0 .. $#listofvalues){
$table_model->new({
field1 => $listofvalues[$key],
field2 => $x,
field3 => $another_listofvalues[$key]
field4 => $yet_another_listofvalues[$key]
});
}
当在请求中收到 两个或更多 元素时,这似乎工作正常。每当收到单个元素时,我都会收到类似
的错误[error] Caught exception in pbitdb::Controller::Subjects->add "Can't use string ("1") as an ARRAY ref while "strict refs" in use at /home/lioneluranl/svn/pbitdb/pbitdb/script/../lib/pbitdb/Controller/Subjects.pm line 119."
在这种情况下,1 是收到的值,119 行 是声明@listofvalues 的行。
现在我已经尝试了几种方法来解决这个问题,但还没有找到任何可以同时工作的方法(对于单个值或多个值)。有什么建议吗?
首先,你问的是数组(一种变量),而不是列表(一个模糊的术语,可以有多种定义,none 其中的定义在这里是相关的)。
是的,你可以有一个只有一个元素的数组。
$ perl -e'my @a = "ele"; CORE::say 0+@a; CORE::say for @a;'
1
ele
这不是问题所在。问题是
@{$params->{parameter_with_many_values}}
预计
$params->{parameter_with_many_values}
包含对数组的引用,但它包含 1
。它可能是使用
$params->{parameter_with_many_values} = @a; # Assigns number of elements
而不是
$params->{parameter_with_many_values} = \@a;
是的,单个元素列表在 Perl 中是可以的,数组和对此类数组的引用也是如此。
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
sub new {
print Dumper \@_;
}
my $table_model = 'main';
for my $values ( [ 'a' .. 'c' ],
[ 'd' ]
) {
my $params = { parameter_with_many_values => $values };
my @listofvalues = @{ $params->{parameter_with_many_values} };
my @another_listofvalues = map uc, @listofvalues;
for my $key (0 .. $#listofvalues) {
my $x = rand;
$table_model->new({
field1 => $listofvalues[$key],
field2 => $x,
field3 => $another_listofvalues[$key]
});
}
}
如何填充 $params->{parameter_with_many_values}
?
更新
看来Catalyst::Request应该提到他们的"safe"参数应该按如下方式处理:
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
for my $params ( { param_with_many_values => 'a' },
{ param_with_many_values => [ 'a' .. 'e' ] },
{ something => 'else' }
) {
my $value_or_values = $params->{param_with_many_values};
my @list_of_values = ref $value_or_values ? @$value_or_values
: defined $value_or_values ? $value_or_values
: ();
print Dumper \@list_of_values;
}