Il 12/03/2017 09:46, liftman ha scritto:
>> Es:
>> perl -e '$a="bbbb";$b="\$a";print $b,"\n";print eval $b,"\n"'
>
> a dire il vero dopo aver postato, ho fatto altri esperimenti ed ho
> provato appnto eval(), ma mi ritornava una stringa vuota... sicuramente
> ho capito male io come usarla, faccio altri esperimenti, grazie!
ho fatto altre prove, al di fuori dell'intero script e sono arrivato
alla conclusione che sono io a sbagliare qualcosa, almeno spero.. :-D
Infatti queste poche righe funzionano come mi sarei aspettato:
my $test;
my $nome = 'pippo';
my @frasi = ("ciao $nome come stai?", "saluti a $nome", "$nome non
conosce il perl");
print $frasi[rand(scalar(@frasi))] . "\n";;
print $frasi[rand(scalar(@frasi))] . "\n";;
print $frasi[rand(scalar(@frasi))] . "\n";;
$test = $frasi[rand(scalar(@frasi))];
print $test . "\n";
$test = $frasi[rand(scalar(@frasi))];
print $test . "\n";
$test = $frasi[rand(scalar(@frasi))];
print $test . "\n";
$test = $frasi[rand(scalar(@frasi))];
print $test . "\n";
e ricevo in output:
liftman@test:~/test$ perl -w
eval3.pl
saluti a pippo
ciao pippo come stai?
ciao pippo come stai?
saluti a pippo
pippo non conosce il perl
saluti a pippo
ciao pippo come stai?
ergo, si tratta al solito di un PEBKAC ed eval() in questo contesto non
serve ad una fava :-D ingago ancora...
vediamo il mio codice originale:
my $nome = $1;
tie @frasi, 'Tie::File', 'frasi';
my $mess = "$frasi[rand(scalar(@frasi))]";
untie @frasi;
ai miei occhi, pare praticamente lo stesso codice dell'esempio, con
l'unica differenza dell'uso di Tie::File, quindi riprovo modificando il
test:
#!/usr/bin/env perl
use strict;
use warnings;
use Tie::File;
my @frasi;
my $nome = 'pippo';
tie @frasi, 'Tie::File', 'frasi';
print $frasi[rand(scalar(@frasi))] . "\n";;
print $frasi[rand(scalar(@frasi))] . "\n";;
print $frasi[rand(scalar(@frasi))] . "\n";;
my $test = $frasi[rand(scalar(@frasi))];
print $test . "\n";
$test = $frasi[rand(scalar(@frasi))];
print $test . "\n";
$test = $frasi[rand(scalar(@frasi))];
print $test . "\n";
$test = $frasi[rand(scalar(@frasi))];
print $test . "\n";
untie @frasi
e il risultato:
liftman@test:~/test$ perl -w
eval3.pl
$nome non conosce il perl
ciao $nome come stai?
ciao $nome come stai?
ciao $nome come stai?
ciao $nome come stai?
ciao $nome come stai?
ciao $nome come stai?
a questo punto sono perplesso.. preferivo essere io a sbagliare,
evidentemente Tie::File, ha un funzionamento anomalo, se proprio non si
vuol parlare di bug. Forse sono l'unico al mondo che ha bisogno di
interpolare una variabile all'interno di un array, letto da disco? :-)
Alla fine, perdendo "elasticità" nel mio script, posso pure evitare il
file su disco, e scrivere tutto diretamente, ma vorrei trovare una
soluzione...