Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re^5: Building a UNIX path from Irritating data

by kyle (Abbot)
on Nov 30, 2009 at 13:24 UTC ( #810152=note: print w/ replies, xml ) Need Help??


in reply to Re^4: Building a UNIX path from Irritating data
in thread Building a UNIX path from Irritating data

I think the problem is that what you have still reads everything into @subfolders. Here's the snippet I'm talking about.

open(FFINFO,"$folderfolder_file") or die "Can't open $folderfolder_fil +e: $!\n"; # This reads in every line from FFINFO my @subfolders = <FFINFO>; my %parents_of; my $parentid; # This loop also wants to read every line, # but the handle is already at EOF, # so it gets nothing. while ( my $line = <FFINFO> ) {

If you need @subfolders for some purpose outside the code we're talking about, you could still have it. Just declare my @subfolders; at the same scope as $parentid and %parents_of, without initializing it. Then, right inside the FFINFO read loop, push every $line in. It winds up looking like this:

open(FFINFO,"$folderfolder_file") or die "Can't open $folderfolder_fil +e: $!\n"; my @subfolders; my %parents_of; my $parentid; while ( my $line = <FFINFO> ) { push @subfolders, $line;

You also had a question about this:

return @parents ? [ map { map { "$_/$folderid" } @{ build_path( +$_ ) } } @parents ] : [ $folderid ];

What this means is, "if @parents is non-empty, return first expression (with nested maps), else return the second expression ($folderid alone in an array reference)." Your description leads me to believe that you have the precedence mixed up. What you describe is this:

( return @parents ) ? [ X ] : [ Y ];

What's happening is this:

return ( @parents ? [ X ] : [ Y ] );

You can see this kind of thing yourself using B::Deparse. I ran this command line:

perl -MO=Deparse,-p input-file.pl

With the -p, it puts parentheses in to clarify how expressions are interpreted. As a result, it showed me this (along with all the other code):

return((@parents ? [map({map({"$_/$folderid";} @{build_path($_);});} @ +parents)] : [$folderid]));

That's not pretty, but it does show that the return is "outside" the whole rest of the line.

I hope this helps. I feel I've written in some haste, so I wouldn't be surprised if I've been unclear. If I have left you with any other questions, feel free to ask.


Comment on Re^5: Building a UNIX path from Irritating data
Select or Download Code
Re^6: Building a UNIX path from Irritating data
by roswell1329 (Acolyte) on Nov 30, 2009 at 23:09 UTC
    Holy smokes! I had to look at this code for about 2 hours to understand it. I see now that build_path always returns a list (array), but usually only with 1 element. I also see that you're using several anonymous arrays for each iteration. It also took me a while to see how you're switching between lists and scalars back and forth. This code is very efficient. It works brilliantly for me now, and I thank you very much for the enlightenment!

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://810152]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (9)
As of 2015-07-07 07:17 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (87 votes), past polls