ПРивет.
сначала я определяю переменную $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 еще не
>определена)
>например:
>
>$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";'
>Ну парень, поправь что-то в алгоритме. А если надо так как ты
>описал то что то типа такого делай:
>
>$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="\$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>";
}
>$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";
Вобщем, насколько я разобрался, вторая интерполяция смешанной переменной невозможна и перл в таком случае выдает ошибку (точнее чего-то ожидает). Можно интерполировать второй раз с помощью 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>";
>Вобщем, насколько я разобрался, вторая интерполяция смешанной переменной невозможна и перл в
>таком случае выдает ошибку (точнее чего-то ожидает). Можно интерполировать второй раз
>с помощью 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 например
Там можно засунуть ифы.Я не проверял код, ты уж сам разберись тем более что експириенса у тебя достаточно, но имхо не по тому пути ты идешь.
>
>Ну порочная практика это.. Возьми HTML::Template::Extentions например
>Там можно засунуть ифы.
Какая? Двойная интерполяция или массив массивов?>Я не проверял код, ты уж сам разберись тем более что експириенса
>у тебя достаточно, но имхо не по тому пути ты идешь.
>
Код, который я написал в конце - работающий (в упрощенном варианте). Я написал его если кому интересно будет решение задачи.Спасибо всем, кто откликнулся =)
возможно запоздало. но вот что я придумал:
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
Супер! Насколько я понял весь секрет примера в предварительном форматировании строки оператором 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.
нет, секрет в _возврате_
можно
my $e = 'sprintf "'.$a.'"';
заменить на
my $e = 'return "'.$a.'"';
>ПРивет.
>сначала я определяю переменную $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, содержащую строку '$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 не опасен.
>ПРивет.
>сначала я определяю переменную $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