[tpm] Using a variable in a 'qw()'

Madison Kelly linux at alteeve.com
Thu Jun 12 10:55:52 PDT 2008


Mike Stok wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> On 12-Jun-08, at 10:25 AM, Madison Kelly wrote:
> 
>> Hi all,
>>
>>  I want to use a variable when calling a module that uses the 'qw()'
>> syntax. Specifically:
>>
>> use Net::DBus::Exporter qw(org.tle_bu.Clients);
>>
>>  I would like to be able to say:
>>
>> my $foo="org.tle_bu.Clients";
>> use Net::DBus::Exporter qw($foo);
>>
>>  But '$foo' is passed in directly, rather than it's value. Is there
>> an
>> alternative to 'qw()'? Honestly, I use that syntax all the time but
>> I've
>> never really understood how it works. Perhaps I should be asking for a
>> pointer to a doc that explains this syntax better?
>>
>> Thanks, as always!
> 
> In addition to the things other people have mentioned, you need to be  
> aware of when variables get set.  use is a BEGIN time thing, so
> 
> #!/usr/bin/env perl
> 
> use strict;
> use warnings;
> 
> my $var = ':standard';
> use CGI ($var);
> print header;
> 
> doesn't do what I intended, and I need to do this to make sure $var is  
> set before the use happens (or something similar depending on what you  
> want the scoping of $var to be):
> 
> #!/usr/bin/env perl
> use strict;
> use warnings;
> 
> my $var;
> BEGIN { $var = ':standard'; }
> use CGI ($var);
> print header;
> 
> Hope this helps,
> 
> Mike

Thanks Mike, Jim and Mark!

   I'm still struggling to get this working, and I think it might be 
what Mike is getting at... My variables are set by reading a config 
file, so sticking the variable into a 'BEGIN {}' won't work as too many 
things have to have happened before I can call the SR that reads the 
file and populates my config hash. I tried wrapping the module call in 
'END {}', but that also didn't work.

   Specifically:

print "dbus::interface::clients: [$$conf{dbus}{interface}{clients}]\n";

   Prints out:

dbus::interface::clients: [org.tle_bu.Clients]

   But when I call:

use Net::DBus::Exporter qq($$conf{dbus}{interface}{clients});

   I get:

Use of uninitialized value in pattern match (m//) at 
/usr/lib/perl5/Net/DBus/Exporter.pm line 263.
Use of uninitialized value in concatenation (.) or string at 
/usr/lib/perl5/Net/DBus/Exporter.pm line 263.
interface name '' is not valid.Names must consist of tokens using the 
characters a-z, A-Z, 0-9, _, with at least two tokens, separated by '.'
BEGIN failed--compilation aborted at ./dbus_server line 74.

   If I call:

use Net::DBus::Exporter qq($$conf{dbus}{interface}{clients});

   Or:

END { use Net::DBus::Exporter qq($$conf{dbus}{interface}{clients}); }

   I get:

Use of uninitialized value in string at ./dbus_server line 74.
interface name '' is not valid.Names must consist of tokens using the 
characters a-z, A-Z, 0-9, _, with at least two tokens, separated by '.'
BEGIN failed--compilation aborted at ./dbus_server line 74.

   Also, just to be safe, I tried sticking the value is a simple 
variable called '$foo', in case being in a hash was part of the problem, 
but that didn't fix anything.

Thanks!

Madi


More information about the toronto-pm mailing list