神圣的猫人,
我正在维护一些非常糟糕的遗留代码,并且有一部分用于从循环创建的HTML表单向数据库添加一些值,并将它提交的变量的名称增加到14,I'在创建HTML之前,将循环更改为它选择的行数。
但问题在于它如何将HTML表单重新插入数据库。
这是处理数据库插入的方式的临时版本
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++;
}
虽然我可能只是要重写整个部分,但我很好奇你是否可以添加类似的东西;
elsif ($count > 14) {
# Say count is 15 and we want to assign
# $name to $name15 using a string and the $count variable here.
$name = "name".$count;
$email = "email".$count;
}
技术上可行吗?
答案 0 :(得分:4)
你所描述的内容在Perl术语中被称为“符号引用”,它通常不赞成作为一种非常非常非常非常的不良实践,因为它只适用于全局变量(通常最好避免使用它们),这是创建几乎不可能找到的错误的最简单方法之一。
但是可以做到。而且,既然你要求维护可能已经同样糟糕的遗留代码,我会告诉你如何:
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
等等。如果您有足够的时间用阵列替换所有这些并测试基于阵列的版本是否仍然有效,那么您将为未来的维护者(可能包括您自己)提高代码质量。