Perl 通过连接字符串和int将变量分配给另一个变量
神圣的猫,男人 我正在维护一些非常糟糕的遗留代码,其中有一部分用于从循环创建的HTML表单向数据库添加一些值,并将提交的变量名称增加到14,我正在将循环更改为创建HTML之前选择的行数 但问题在于如何将HTML表单插入到数据库中 下面是它处理数据库插入方式的特别版本Perl 通过连接字符串和int将变量分配给另一个变量,perl,Perl,神圣的猫,男人 我正在维护一些非常糟糕的遗留代码,其中有一部分用于从循环创建的HTML表单向数据库添加一些值,并将提交的变量名称增加到14,我正在将循环更改为创建HTML之前选择的行数 但问题在于如何将HTML表单插入到数据库中 下面是它处理数据库插入方式的特别版本 while (my $count <= 14) { if ($count == 1) { $name = $name1; $email = $email1; } # ... if ($count
while (my $count <= 14) {
if ($count == 1) {
$name = $name1;
$email = $email1;
}
# ...
if ($count == 14) {
$name = $name14;
$email = $email14;
}
my $sth = $dbh->prepare("INSERT INTO table SET name = ? AND email = ?");
$sth->execute($name, $email);
$count++;
}
这在技术上可行吗?您所描述的在Perl行话中被称为“符号引用”,它通常被认为是一个非常非常。。。这是一种非常糟糕的做法,因为它只适用于全局变量(通常最好避免使用全局变量),而且这是创建几乎不可能发现的bug的最简单方法之一 但这是可以做到的。而且,由于您要求维护可能已经同样糟糕的遗留代码,我将向您展示如何:
perl -e '$count14 = 42; $sref = "count14"; print $$sref . "\n"'
就这么简单
但是,真的,如果你能避免的话,就不要这样做
避免符号引用的一般解决方案是使用哈希:
my %values = (name1 => 'Alice', name2 => 'Bob');
for my $count (1 .. 2) {
my $name = $values{'name' . $count};
print "$name\n";
}
但是,在一组名为foo1
、foo2
等变量的特定情况下,您可能需要一个数组:
my @names = qw( . Alice Bob ); # '.' is a dummy to fill index 0 so the names start at 1
for my $count (1 .. 2) {
my $name = $names[$count];
print "$name\n";
}
我强烈建议使用这些其他技术之一,而不是符号引用,除非现有代码严重依赖于可用的
$name1
,$name2
等。如果您有足够的时间用数组替换所有这些代码,并测试基于数组的版本是否仍然有效,您将为未来的维护人员(可能包括您自己)提高代码的质量。您所描述的在Perl行话中被称为“符号引用”,通常被认为是非常非常,非常这是一种非常糟糕的做法,因为它只适用于全局变量(通常最好避免使用全局变量),而且这是创建几乎不可能发现的bug的最简单方法之一
但这是可以做到的。而且,由于您要求维护可能已经同样糟糕的遗留代码,我将向您展示如何:
perl -e '$count14 = 42; $sref = "count14"; print $$sref . "\n"'
就这么简单
但是,真的,如果你能避免的话,就不要这样做
避免符号引用的一般解决方案是使用哈希:
my %values = (name1 => 'Alice', name2 => 'Bob');
for my $count (1 .. 2) {
my $name = $values{'name' . $count};
print "$name\n";
}
但是,在一组名为foo1
、foo2
等变量的特定情况下,您可能需要一个数组:
my @names = qw( . Alice Bob ); # '.' is a dummy to fill index 0 so the names start at 1
for my $count (1 .. 2) {
my $name = $names[$count];
print "$name\n";
}
我强烈建议使用这些其他技术之一,而不是符号引用,除非现有代码严重依赖于可用的
$name1
,$name2
等。如果您有足够的时间用阵列替换所有这些,并测试基于阵列的版本是否仍然有效,您将为未来的维护人员(可能包括您自己)提高代码质量。在您的阵列示例中,您的索引是一次性的。。。它应该是对于我的$count(0..1){
发现得很好,@dgw!我向数组添加了一个伪值来填充0点,而不是更改循环,因为我希望索引与OP的现有代码匹配(以$name1
开始,而不是$name0
)。在您的数组示例中,您的索引是一次性的…对于我的$count(0..1),它应该是{
非常准确,@dgw!我向数组添加了一个虚拟值以填充0点,而不是更改循环,因为我希望索引与OP的现有代码匹配(以$name1
开始,而不是$name0
)。必须链接到。您几乎总是需要哈希或数组。必须链接到。您几乎总是需要哈希或数组。