Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Perl > Perl Misc > Trying to parse a variable name

Reply
Thread Tools

Trying to parse a variable name

 
 
Aaron
Guest
Posts: n/a
 
      08-17-2004
Basically I'm reading a SQL predicate from an XML file. The predicate
contains a perl variable name.

I have a sub called parseValue that takes a literal string and then
returns the value.

Now, if I pass in a qq{} or ' ' quoted string it works fine, but when
I pass in the value from the XML file it doesn't work.

I should get the following output:

PARSED STRING: ENGINE_ID = 1
PARSED STRING: ENGINE_ID = 1

But I get the following:

PARSED STRING: ENGINE_ID = 1
PARSED STRING: ENGINE_ID = &parseValue($engine_id)

What the heck is going on?

I've included the code and the XML file below.

#!/usr/bin/perl

use XML::Simple;
use Data:umper;

$engine_id = 1;

sub parseValue
{
my $value = shift;

$value =~ s/\$(\w+)/${$1}/;

return $value;
}

print "PARSED VALUE: ",&parseValue('$engine_id'),"\n";

sub BySequence
{
$transforms->{Transform}->{$a}->{Sequence} <=>
$transforms->{Transform}->{$b}->{Sequence}
}

$transforms = XMLin("test.xml",forcearray => ["Transform"]);

foreach $transform (sort BySequence keys %{$transforms->{Transform}})
{
%transform = %{$transforms->{Transform}->{$transform}};

$delete_predicate = $transform{DeletePredicate};

print "$delete_predicate\n";
$delete_predicate =~ s/(\$\w+)/&parseValue($1)/g;
print "$delete_predicate\n";

%transform = ();
}

<?xml version="1.0" ?>
<Transforms>
<Transform Sequence="1" name="Planned Order">
<DeletePredicate>ENGINE_ID =
$engine_id</DeletePredicate>
</Transform>
</Transforms>
 
Reply With Quote
 
 
 
 
Gunnar Hjalmarsson
Guest
Posts: n/a
 
      08-17-2004
[ Did not reply to the defunct group comp.lang.perl. ]

Aaron wrote:
> I have a sub called parseValue that takes a literal string and then
> returns the value.


<snip>

> sub parseValue
> {
> my $value = shift;
> $value =~ s/\$(\w+)/${$1}/;
> return $value;
> }


Then you don't have strictures enabled, and you are in the business of
symbolic references. There are better methods to achive the same
thing, such as plain replacements based on a set of keys/values in a
hash.

> when I pass in the value from the XML file it doesn't work.


<snip>

Is it this line you are talking about?

> $delete_predicate =~ s/(\$\w+)/&parseValue($1)/g;


Then you may want to check the Perl FAQ:

perldoc -q "expand function calls"

--
Gunnar Hjalmarsson
Email: http://www.gunnar.cc/cgi-bin/contact.pl
 
Reply With Quote
 
 
 
 
Eric Bohlman
Guest
Posts: n/a
 
      08-17-2004
Gunnar Hjalmarsson <(E-Mail Removed)> wrote in news:2oesn4Fa2edpU1@uni-
berlin.de:

> Is it this line you are talking about?
>
>> $delete_predicate =~ s/(\$\w+)/&parseValue($1)/g;

>
> Then you may want to check the Perl FAQ:
>
> perldoc -q "expand function calls"


Actually, I think a visit to "quotes and quote-like operators" in perlop,
specifically the description of the s operator, would be more in order. I
wouldn't look too kindly on any code that uses one of the methods from that
particular FAQ in the replacement part of an s.

Oh, and I'd also recommend the OP read the posting guidelines, particularly
the parts about letting perl give you all the help it can and about posting
actual code (the original post mentioned output that contained literal
strings not present in the posted code).
 
Reply With Quote
 
Gunnar Hjalmarsson
Guest
Posts: n/a
 
      08-17-2004
Eric Bohlman wrote:
> Gunnar Hjalmarsson wrote:
>> Is it this line you are talking about?
>>
>>> $delete_predicate =~ s/(\$\w+)/&parseValue($1)/g;

>>
>> Then you may want to check the Perl FAQ:
>>
>> perldoc -q "expand function calls"

>
> Actually, I think a visit to "quotes and quote-like operators" in
> perlop, specifically the description of the s operator, would be
> more in order.


Yeah, I should have mentioned that, too.

> I wouldn't look too kindly on any code that uses one of the methods
> from that particular FAQ in the replacement part of an s.


Now I'm not following you. Actually, it only mentions one method. Why
would you object to

s/to_be_replaced/@{ [ somefunction() ] }/

?

--
Gunnar Hjalmarsson
Email: http://www.gunnar.cc/cgi-bin/contact.pl
 
Reply With Quote
 
Paul Lalli
Guest
Posts: n/a
 
      08-17-2004
On Tue, 17 Aug 2004, Gunnar Hjalmarsson wrote:

> Eric Bohlman wrote:
> > Gunnar Hjalmarsson wrote:
> >> Is it this line you are talking about?
> >>
> >>> $delete_predicate =~ s/(\$\w+)/&parseValue($1)/g;
> >>
> >> Then you may want to check the Perl FAQ:
> >>
> >> perldoc -q "expand function calls"

> >
> > Actually, I think a visit to "quotes and quote-like operators" in
> > perlop, specifically the description of the s operator, would be
> > more in order.

>
> Yeah, I should have mentioned that, too.
>
> > I wouldn't look too kindly on any code that uses one of the methods
> > from that particular FAQ in the replacement part of an s.

>
> Now I'm not following you. Actually, it only mentions one method. Why
> would you object to
>
> s/to_be_replaced/@{ [ somefunction() ] }/


I'd object to that because 1) it's ugly, 2) it's non-intuitive, 3) there's
a 'better' (more standard?) way.

s/to_be_replaced/somefunction()/e

But that's just me.

Paul Lalli
 
Reply With Quote
 
Gunnar Hjalmarsson
Guest
Posts: n/a
 
      08-17-2004
Paul Lalli wrote:
> Gunnar Hjalmarsson wrote:
>>
>> Why would you object to
>>
>> s/to_be_replaced/@{ [ somefunction() ] }/

>
> I'd object to that because 1) it's ugly, 2) it's non-intuitive, 3)
> there's a 'better' (more standard?) way.
>
> s/to_be_replaced/somefunction()/e


Well, in that simple case, I would have done so, too.

But let's assume that the return value from the function is only a
part of the replacement string:

s/to_be_replaced/start @{ [ somefunction() ] } end/

s/to_be_replaced/'start ' . somefunction() . ' end'/e

Which is best is no longer *that* obvious, is it?

--
Gunnar Hjalmarsson
Email: http://www.gunnar.cc/cgi-bin/contact.pl
 
Reply With Quote
 
Eric Bohlman
Guest
Posts: n/a
 
      08-18-2004
Gunnar Hjalmarsson <(E-Mail Removed)> wrote in news:2of8kiFa6jqmU1@uni-
berlin.de:

> Well, in that simple case, I would have done so, too.
>
> But let's assume that the return value from the function is only a
> part of the replacement string:
>
> s/to_be_replaced/start @{ [ somefunction() ] } end/
>
> s/to_be_replaced/'start ' . somefunction() . ' end'/e
>
> Which is best is no longer *that* obvious, is it?


I'd prefer s/to_be_replaced/sprintf('start %s end',somefunction())/e;

I'm just not the type who values using tricks for things that have standard
solutions.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
REXML::Document could not parse UTF-8 "<name>\302</name>" Jesse P. Ruby 0 01-04-2008 05:37 PM
"Variable variable name" or "variable lvalue" mfglinux Python 11 09-12-2007 03:08 AM
adding a variable name to a hash to name is part of the variable name Bobby Chamness Perl 2 04-22-2007 09:54 PM
Trying to parse a variable name Aaron Perl 1 08-17-2004 05:14 PM
How do I scope a variable if the variable name contains a variable? David Filmer Perl Misc 19 05-21-2004 03:55 PM



Advertisments