Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 通过连接字符串和int将变量分配给另一个变量_Perl - Fatal编程技术网

Perl 通过连接字符串和int将变量分配给另一个变量

Perl 通过连接字符串和int将变量分配给另一个变量,perl,Perl,神圣的猫,男人 我正在维护一些非常糟糕的遗留代码,其中有一部分用于从循环创建的HTML表单向数据库添加一些值,并将提交的变量名称增加到14,我正在将循环更改为创建HTML之前选择的行数 但问题在于如何将HTML表单插入到数据库中 下面是它处理数据库插入方式的特别版本 while (my $count <= 14) { if ($count == 1) { $name = $name1; $email = $email1; } # ... if ($count

神圣的猫,男人

我正在维护一些非常糟糕的遗留代码,其中有一部分用于从循环创建的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++;
}

这在技术上可行吗?

您所描述的在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
)。必须链接到。您几乎总是需要哈希或数组。必须链接到。您几乎总是需要哈希或数组。