The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Двойная интерполяция переменных"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Двойная интерполяция переменных"
Сообщение от DiM_root emailИскать по авторуВ закладки(ok) on 24-Ноя-04, 19:53  (MSK)
ПРивет.
сначала я определяю переменную $a, содержащую строку '$b' (переменная $b еще не определена)
например:

$a='<td>$b</td><td>$c</td>';

а затем мне надо в цикле заполнить переменные $b и $c их значениями
я делаю так:

while(my($b,$c) = $::currentquery->fetchrow_array){
$result .= "<tr>$a</tr>";
}

Так вот вторая интерполяция переменных $b и $c не получается. Как будто они вообще становятся не переменными.
В итоге мне нужно получить таблицу с результатами вида
|  B  |  C  |
-------------
|  1  |  x  |
-------------
|  2  |  y  |
-------------
|  3  |  z  |
-------------
....


а получаю:
|  B   |  C   |
---------------
|  $b  |  $c  |
---------------
|  $b  |  $c  |
---------------
|  $b  |  $c  |
---------------
....

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Двойная интерполяция переменных"
Сообщение от gr Искать по авторуВ закладки on 25-Ноя-04, 05:01  (MSK)
>ПРивет.
>сначала я определяю переменную $a, содержащую строку '$b' (переменная $b еще не
>определена)
>например:
>
>$a='<td>$b</td><td>$c</td>';
>
>а затем мне надо в цикле заполнить переменные $b и $c их
>значениями
>я делаю так:
>
>while(my($b,$c) = $::currentquery->fetchrow_array){
>$result .= "<tr>$a</tr>";
>}
>
>Так вот вторая интерполяция переменных $b и $c не получается. Как будто
>они вообще становятся не переменными.
>В итоге мне нужно получить таблицу с результатами вида
>|  B  |  C  |
>-------------
>|  1  |  x  |
>-------------
>|  2  |  y  |
>-------------
>|  3  |  z  |
>-------------
>....
>
>
>а получаю:
>|  B   |  C   |
>---------------
>|  $b  |  $c  |
>---------------
>|  $b  |  $c  |
>---------------
>|  $b  |  $c  |
>---------------
>....


Ну парень, поправь что-то в алгоритме. А если надо так как ты описал то что то типа такого делай:

$a="\$b";
$b=100;
print eval "$a";'

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Двойная интерполяция переменных"
Сообщение от DiM_root emailИскать по авторуВ закладки(ok) on 25-Ноя-04, 14:10  (MSK)
>Ну парень, поправь что-то в алгоритме. А если надо так как ты
>описал то что то типа такого делай:
>
>$a="\$b";
>$b=100;
>print eval "$a";'


Другие пути решения слишком сложные и запутанные. думаю в моем случае это будет лучший вариант.
Но вот пример с eval не хочет работать. Значения получаются нулевыми (NULL).

Значит, теперь я делал так:
$a = "<td>\$b</td><td>\$c</td>";
$x = eval "$a";
while(my($b,$c) = $::currentquery->fetchrow_array){
$result .= "<tr>$x</tr>";
}

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Двойная интерполяция переменных"
Сообщение от gr Искать по авторуВ закладки on 25-Ноя-04, 16:18  (MSK)
>>Ну парень, поправь что-то в алгоритме. А если надо так как ты
>>описал то что то типа такого делай:
>>
>>$a="\$b";
>>$b=100;
>>print eval "$a";'
>
>
>Другие пути решения слишком сложные и запутанные. думаю в моем случае это
>будет лучший вариант.
>Но вот пример с eval не хочет работать. Значения получаются нулевыми (NULL).
>
>
>Значит, теперь я делал так:
>$a = "<td>\$b</td><td>\$c</td>";
>$x = eval "$a";
>while(my($b,$c) = $::currentquery->fetchrow_array){
>$result .= "<tr>$x</tr>";
>}

$a = "<td>\$b</td><td>\$c</td>";
while(my($b,$c) = $::currentquery->fetchrow_array){
$x = eval "$a";
$result .= "<tr>$x</tr>";
}


  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Двойная интерполяция переменных"
Сообщение от DiM_root emailИскать по авторуВ закладки(ok) on 25-Ноя-04, 16:39  (MSK)

>$a = "<td>\$b</td><td>\$c</td>";
>while(my($b,$c) = $::currentquery->fetchrow_array){
>$x = eval "$a";
>$result .= "<tr>$x</tr>";
>}

нет, здесь проблема не в этом.
В данном случае проблема, что идет смесь скаляров с переменными.

Пример
$a="\$b";
$b=100;
print eval "$a";
работать будет, а вот если в $a добавить <td>, то все ломается.
Как быть?

Или подскажите другой вариант решения задачи. Нужно вывести таблицу MySQL в HTML таблицу, но так, чтобы можно было указывать какие столбцы нужно отображать. Я получаю массив отмеченных html-чекбоксов в @fields - это столбцы, которые должны быть в таблице. Затем составляю "строку" (<tr>) из "столбцов" (<td>) и запускаю ее в цикле while.

foreach(@fields){
if ($_ eq 'cr_date'){$td_result .= "<td>\$created</td>";}
if ($_ eq 'exp_date'){$td_result .= "<td>\$expiration</td>";}
if ($_ eq 'comments'){$td_result .= "<td>\$comments</td>";}
}

$result = "<table border=1>\n";
&db_wlc_connect;
&db_wlc_query(qq{SELECT * FROM mytable});
while(my($created,$expiration,$comments)=$::currentquery_w->fetchrow_array)
{
$td_res = eval "$td_result";
$result .= "<tr>$td_res</tr>\n";
}
$result .= "</table>\n";

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Двойная интерполяция переменных"
Сообщение от DiM_root emailИскать по авторуВ закладки(ok) on 25-Ноя-04, 19:18  (MSK)
Вобщем, насколько я разобрался, вторая интерполяция смешанной переменной невозможна и перл в таком случае выдает ошибку (точнее чего-то ожидает). Можно интерполировать второй раз с помощью eval только в таком виде
$a="\$b";
$b=100;
print eval "$a";

Если кому интересно, то вывод Mysql таблицы я сделал с помощью массива массивов (упрощенный вариант):

$result .= "<table border=1><tr>$td_head</tr>\n";
&db_wlc_connect;
&db_wlc_query(qq{SELECT * FROM mytable});
my $arrayref = $::currentquery->fetchall_arrayref;
my($kk, $jj);
for $kk (0 .. $#{$arrayref}) {
  $result .= "<tr>";
  for $jj (0 .. $#{$arrayref->[$kk]}) {
    $result .= "<td>"."$arrayref->[$kk][$jj]"."</td>";
  }
  $result .= "</tr>\n";
}
$::currentquery_w->finish;
$::db_wlc->disconnect if $::db_wlc;
$result .= "</table>";

  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Двойная интерполяция переменных"
Сообщение от gr Искать по авторуВ закладки on 25-Ноя-04, 19:36  (MSK)
>Вобщем, насколько я разобрался, вторая интерполяция смешанной переменной невозможна и перл в
>таком случае выдает ошибку (точнее чего-то ожидает). Можно интерполировать второй раз
>с помощью eval только в таком виде
>$a="\$b";
>$b=100;
>print eval "$a";
>
>Если кому интересно, то вывод Mysql таблицы я сделал с помощью массива
>массивов (упрощенный вариант):
>
>$result .= "<table border=1><tr>$td_head</tr>\n";
>&db_wlc_connect;
>&db_wlc_query(qq{SELECT * FROM mytable});
>my $arrayref = $::currentquery->fetchall_arrayref;
>my($kk, $jj);
>for $kk (0 .. $#{$arrayref}) {
>  $result .= "<tr>";
>  for $jj (0 .. $#{$arrayref->[$kk]}) {
>    $result .= "<td>"."$arrayref->[$kk][$jj]"."</td>";
>  }
>  $result .= "</tr>\n";
>}
>$::currentquery_w->finish;
>$::db_wlc->disconnect if $::db_wlc;
>$result .= "</table>";


Ну порочная практика это.. Возьми HTML::Template::Extentions например
Там можно засунуть ифы.

Я не проверял код, ты уж сам разберись тем более что експириенса у тебя достаточно, но имхо не по тому пути ты идешь.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "Двойная интерполяция переменных"
Сообщение от DiM_root emailИскать по авторуВ закладки(ok) on 25-Ноя-04, 19:49  (MSK)
>
>Ну порочная практика это.. Возьми HTML::Template::Extentions например
>Там можно засунуть ифы.
Какая? Двойная интерполяция или массив массивов?

>Я не проверял код, ты уж сам разберись тем более что експириенса
>у тебя достаточно, но имхо не по тому пути ты идешь.
>
Код, который я написал в конце - работающий (в упрощенном варианте). Я написал его если кому интересно будет решение задачи.

Спасибо всем, кто откликнулся =)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "Двойная интерполяция переменных"
Сообщение от rWizard emailИскать по авторуВ закладки(ok) on 26-Ноя-04, 04:05  (MSK)
возможно запоздало. но вот что я придумал:
game root # cat test.pl
#!/usr/bin/perl
use strict;

my $a = '<test> $b </test> $c';

my @B = ('a'..'d');
my @C = (1..4);

for ( my $i=0; $i < 4; $i++)
    {
    my $b = $B[$i];
    my $c = $C[$i];
    my $e = 'sprintf "'.$a.'"';
# тут внимание! eval выполняет _оператор(ы)_ содержащиеся в строке.
# конечно, это не опримально, но работать будет и код достаточно маленький
    print eval($e);
    print "\n";
    }

game root # perl test.pl
<test> a </test> 1
<test> b </test> 2
<test> c </test> 3
<test> d </test> 4


  Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "Двойная интерполяция переменных"
Сообщение от DiM_root emailИскать по авторуВ закладки(ok) on 26-Ноя-04, 13:09  (MSK)
Супер! Насколько я понял весь секрет примера в предварительном форматировании строки оператором sprintf =)
Я его плохо знаю, поэтому не использовал.

Вот я немного упростил твой пример с использованием хеша:

#!/usr/bin/perl
use strict;

my $a = '<test> $b </test> $c';

my %X = ('a','1', 'b','2', 'c','3', 'd','4');
foreach $b(keys(%X)){
    my $c = $X{$b};
    my $e = 'sprintf "'.$a.'"';
    print eval($e);
    print "\n";
}

Результат:
<test> a </test> 1
<test> c </test> 3
<test> b </test> 2
<test> d </test> 4

НО Поскольку из хеша ключи и значения вытаскиваются беспорядочно, то последовательность a,b,c,d здесь не гарантирована.
Если надо отсортировать, то ставится оператор sort перед keys.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

12. "Двойная интерполяция переменных"
Сообщение от rWizard emailИскать по авторуВ закладки(ok) on 26-Ноя-04, 20:54  (MSK)
нет, секрет в _возврате_
можно
my $e = 'sprintf "'.$a.'"';
заменить на
my $e = 'return "'.$a.'"';
  Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "Двойная интерполяция переменных"
Сообщение от konst emailИскать по авторуВ закладки(??) on 26-Ноя-04, 18:43  (MSK)
>ПРивет.
>сначала я определяю переменную $a, содержащую строку '$b' (переменная $b еще не
>определена)
>например:
>
>$a='<td>$b</td><td>$c</td>';
>
>а затем мне надо в цикле заполнить переменные $b и $c их
>значениями
>я делаю так:
>
>while(my($b,$c) = $::currentquery->fetchrow_array){
>$result .= "<tr>$a</tr>";
>}
а не лучше ли:
while(my($b,$c) = $::currentquery->fetchrow_array){
$result .= "<tr><td>$b</td><td>$c</td></tr>";
}
? Зачем навороты? eval - не самая безопасная функция, особенно для web. Кроме того, код будет мене читабельным...
imho - надо правильный алгоритм построить, а не "интерполировать" :)
  Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "Двойная интерполяция переменных"
Сообщение от DiM_root emailИскать по авторуВ закладки(ok) on 26-Ноя-04, 18:57  (MSK)
>>ПРивет.
>>сначала я определяю переменную $a, содержащую строку '$b' (переменная $b еще не
>>определена)
>>например:
>>
>>$a='<td>$b</td><td>$c</td>';
>>
>>а затем мне надо в цикле заполнить переменные $b и $c их
>>значениями
>>я делаю так:
>>
>>while(my($b,$c) = $::currentquery->fetchrow_array){
>>$result .= "<tr>$a</tr>";
>>}
>а не лучше ли:
>while(my($b,$c) = $::currentquery->fetchrow_array){
>$result .= "<tr><td>$b</td><td>$c</td></tr>";
>}
>? Зачем навороты? eval - не самая безопасная функция, особенно для web.
>Кроме того, код будет мене читабельным...
>imho - надо правильный алгоритм построить, а не "интерполировать" :)


Да ты задачу не понял :)
переменная $a - переменная (о как сказал :)), т.е. она может быть
и <tr><td>$b</td><td>$c</td></tr>, и <tr><td>$b</td></tr>, и <tr><td>$b</td><td>$c</td><td><b>$foo</b></td></tr>....

У меня переменная $a определяется в теле скрипта в зависимости от условий и "внешние" данные в нее не попадают. Думаю в этом случае eval не опасен.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

13. "Решение задачи двойная интерполяция переменных"
Сообщение от Roma Искать по авторуВ закладки(??) on 07-Дек-04, 18:16  (MSK)
>ПРивет.
>сначала я определяю переменную $a, содержащую строку '$b' (переменная $b еще не
>определена)
>например:
>
>$a='<td>$b</td><td>$c</td>';
>
>а затем мне надо в цикле заполнить переменные $b и $c их
>значениями
>я делаю так:
>
>while(my($b,$c) = $::currentquery->fetchrow_array){
>$result .= "<tr>$a</tr>";
>}
>
>Так вот вторая интерполяция переменных $b и $c не получается. Как будто
>они вообще становятся не переменными.
>В итоге мне нужно получить таблицу с результатами вида
>|  B  |  C  |
>-------------
>|  1  |  x  |
>-------------
>|  2  |  y  |
>-------------
>|  3  |  z  |
>-------------
>....
>
>
>а получаю:
>|  B   |  C   |
>---------------
>|  $b  |  $c  |
>---------------
>|  $b  |  $c  |
>---------------
>|  $b  |  $c  |
>---------------
>....

решение задачи:

while(my($b,$c) = $::currentquery->fetchrow_array){
  eval "\$result .= \"<tr>$a</tr>\"";
}

вот кусок моего работающего кода:
my $ldr = get_cmd(); # get command line
eval "\$cmd = \"$ldr\""; # var interpolation
`$cmd`; # execute

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру