Присвойте переменную другой переменной путем объединения строки и целого числа - PullRequest
0 голосов
/ 30 апреля 2018

Святой кот, человек,

Я поддерживаю довольно ужасный унаследованный код, и есть часть для добавления некоторых значений в базу данных из 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;
}

Это технически возможно?

1 Ответ

0 голосов
/ 30 апреля 2018

То, что вы описываете, называется в Perl lingo «символической ссылкой», и это, как правило, осуждается как очень, очень, очень ... очень плохая практика, потому что она работает только с глобальными переменными ( которые, как правило, лучше избегать сами по себе), и это один из самых простых способов создания ошибок, которые почти невозможно найти.

Но это можно сделать. И, поскольку вы просите сохранить устаревший код, который, вероятно, уже столь же плох, я покажу вам, как:

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 и т. Д. Если вы можете позволить себе время заменить все эти массивы и проверить, что версия на основе массива все еще работает, вы улучшите качество кода для будущих сопровождающих (который, вероятно, будет включать вас).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...