Hi
kyle --
I've been working on your code for a while, and I cannot yet see how it builds a path, and I cannot get it to work for me. I copied your code above exactly as you said and used the data file that I provided, but here's the output I get:
100 => 100
101 => 101
1013 => 1013
1014 => 1014
1015 => 1015
1053 => 1053
1057 => 1057
1059 => 1059
1065 => 1065
119 => 119
1198 => 1198
1227 => 1227
1228 => 1228
1229 => 1229
1230 => 1230
1231 => 1231
1232 => 1232
1233 => 1233
1234 => 1234
1238 => 1238
1239 => 1239
1241 => 1241
1298 => 1298
1299 => 1299
1300 => 1300
1311 => 1311
1317 => 1317
1318 => 1318
1320 => 1320
1321 => 1321
1322 => 1322
1323 => 1323
1324 => 1324
1325 => 1325
1327 => 1327
1328 => 1328
1329 => 1329
1347 => 1347
1348 => 1348
1349 => 1349
1350 => 1350
1351 => 1351
1352 => 1352
1374 => 1374
1375 => 1375
1376 => 1376
1377 => 1377
1390 => 1390
1393 => 1393
1394 => 1394
1395 => 1395
1396 => 1396
1397 => 1397
1398 => 1398
...
I think the line that may be wrong in my code is this one:
return @parents ? [ map {
map { "$_/$folderid" } @{ build_path( $_ ) }
} @parents ]
: [ $folderid ];
I've never seen a "return" command used in a conditional this way. It would seem to me that in order for the conditional to be true, the focus would have already returned to the line calling build_path originally. Does this actually mean if "return @parents"
would succeed then do X, if not, Y?
I really appreciate your help. I think this is very close to what I need, but I'm missing some keystone. To make sure I got your code correct, here's the exact script I'm running (in cygwin on a windows system, and on an HPUX system):
#!/usr/bin/perl -w
use strict;
my $foldername_file = shift @ARGV;
my $folderfolder_file = shift @ARGV;
my %folders = ();
my %folderpaths = ();
open(FNAMES,"$foldername_file") or die "Can't open $foldername_file: $
+!\n";
foreach my $folderline (<FNAMES>) {
chomp $folderline;
if ($folderline =~ /^Folder (\d{3,5})\s+\-\s+(.*)\.$/) {
$folders{$1} = $2;
}
}
close(FNAMES);
open(FFINFO,"$folderfolder_file") or die "Can't open $folderfolder_fil
+e: $!\n";
my @subfolders = <FFINFO>;
my %parents_of;
my $parentid;
while ( my $line = <FFINFO> ) {
if ($line =~ /^Folder (\d{3,5})\s+\-\s+.*\./) {
$parentid = $1;
}
elsif ($line =~ /\s+subfolder\s+(\S+)\s+\-\s+.*\./) {
push @{ $parents_of{ $1 } }, $parentid;
}
}
sub build_path {
my $folderid = shift @_;
my @parents = @{ $parents_of{ $folderid } || [] };
return @parents ? [ map {
map { "$_/$folderid" } @{ build_path(
+$_ ) }
} @parents ]
: [ $folderid ];
}
foreach my $k (sort (keys (%folders))) {
$folderpaths{$k} = build_path($k);
print "$k => $_\n" for @{ $folderpaths{$k} };
}
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.