圣猫人,
我正在维护一些非常糟糕的遗留代码,其中有一部分用于从循环创建的 HTML 表单中向数据库添加一些值,并将其提交的变量名称增加到 14,我正在更改循环到创建 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;
}
这在技术上可行吗?
最佳答案
你所描述的在 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
等可用。如果您有时间用数组替换所有这些并测试基于数组的版本是否仍然有效,那么您将为 future 的维护人员(可能包括您自己)提高代码的质量。
关于perl - 通过连接字符串和 int 将一个变量分配给另一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50095571/