[bcn-pm] Getopt::Long i funcions per una mateixa opció

Arnau Bria listsarnau a gmail.com
dll feb 6 03:34:38 PST 2012


On Mon, 6 Feb 2012 10:18:00 +0100
Arnau Bria wrote:

> On Sun, 5 Feb 2012 23:38:08 +0100
> Alex Muntada wrote:

Hola Àlex,
 
> > Hola Arnau, s'ajusta el que et vaig dir al que tu volies? Si no
> > s'acaba d'entendre, digues-m'ho i t'ho explico millor.

El que jo havia entès és que al hash %opt crees les relacions
opcions->funció a cridar, i en el GetOption crides a la funció que toca
fent referència al hash anteriorment creat. I ho veia prou fàcil...
Però al llegir que el primer argument és el nom de l'opció, que el
segon el valor a guardar (o si parlem de hash, la clau del hash) i el
tercer, el valor a guardar, he començat a penar en un hash més
complicat.

Per tant, he creat:

my %opt = ( 'list'      => {
        postinstall     => list_postinstall(),
        distros         => list_distros(),
        },
        );

i ho acabo cridant com:
GetOptions ('list=s' => sub {$opt{$_[0]}->($_[1])->($_[2])});


que funciona, però dona un 'warning?' que diu:
Not a CODE reference at /usr/bin/kickgen line 56
just la linea del GetOptions.

si canvio els "(" per "{", el codi continua funcioant però em diu:

Can't use string ("") as a HASH ref while "strict refs" in use
at /usr/bin/kickgen line 56.

Per tant, el codi funciona però no entenc perquè es queixa.

Si faig un Dumper del hash:

$VAR1 = {
          'list' => {
                      'postinstall' => '',
                      'distros' => ''
                    }
        };

I crec que per això es queixa, però no ho acabo de tindre clar....

Algú m'ho podria acabar d'explicar?

moltes gràcies en endavant!
Arnau


Més informació sobre la llista de correu Barcelona-pm