A Perl Chicken-and-egg problem
Paul King
sciguy-Ja3L+HSX0kI at public.gmane.org
Sat Jun 21 19:25:14 UTC 2008
On Sat, 2008-06-21 at 14:58 -0400, Richard Dice wrote:
> Hi Paul,
>
>
> my @A = myobj::files::list(params); // same declaration as in
> the docs
> foreach $x (@A) {
> print "$x\n";
> }
>
> First, I take it that somewhere on the disk you have a file called
> myobj/files.pm and there is a "sub list {...}" within it? Also,
> "params" should be written "@params".
To slavishly follow what is in the spirit of the documentation:
my @A = myobj::files::list($a, $b, $c, ...);
I think there are about 6 or 7 parameters (although I suppose an array
would be more correct than the above code I had). I let Perl install the
modules through CPAN (perl -MCPAN -e shell), so Perl should have taken
care of the installation.
Thanks for the rest of your code suggestions. It is a big help.
Paul King
>
> Also, please make sure you "use strict;" and "use warnings;" in your
> programs, and then you will need to lexicalize your 'foreach' loop
> iteration variables, making it "foreach my $x ( ... ) { ... }".
>
> On to your ultimate code example:
>
> my @A = myobj::files::list(params);
> foreach $x (@A) {
> for ($i = 0; $i < 16; $i++) {
> for $j = 0; $j < 16; $j++) {
> print "$x->[$i][$j]\n";
> }
> }
> }
>
> This kind of works. I get the output I expect, except for one
> thing. I
> don't know the array size, so I am hard-coding the upper limit
> of the
> loops. $#x to find the size doesn't work, since (1) $x merely
> points to
> an array, and (2) the array is two dimensional. Any
> suggestions?
>
> There are two ways to cope with this.
>
> First, you _can_ continue to work with the C-style approach you have
> written above and improve it by using the $#ARRAY syntax, but you need
> to give the $#ARRAY syntax what it needs in order to work.
>
> my @A = myobj::files::list(@params);
> foreach $x (@A) {
> for ($i = 0; $i < $#{@$x}; $i++) {
> for $j = 0; $j < $#{@{$x->[$i]}; $j++) {
> print "$x->[$i][$j]\n";
> }
> }
> }
>
>
> Here's a small program that might make the technique a bit more
> explicit.
>
> #!
> perl
>
> use warnings;
> use strict;
>
> my $a = [ 'a' .. 'z', [10 .. 15] ];
>
> print $#{@$a} . "\n";
> print $#{@{$a->[$#{@$a}]}} . "\n";
> print $a->[ $#{@$a} ][ $#{@{$a->[ $#{@$a} ]}} ] . "\n";
>
> exit 0;
>
>
> $a is a reference to an array, so it would be analogous to a single
> element within your @A array.
>
> I stuff it with the characters 'a' through 'z', which is 26 elements,
> though the final element has array element index 25 (since arrays
> start at index 0). Then I tack on a 27th element (array index 26),
> which is itself a reference to an array which contains the integers
> 10, 11, 12, 13, 14, 15. This is a list of 6 elements, so its last
> index has a value 5.
>
> The output of the program is three lines. The first line is "26".
> The second line is "5". The third line is "15".
>
> This is the old C-style of doing things. Unless you actually need to
> know array indices for some other reason then it's not what I would
> recommend. Here's a much simpler Perl-style approach.
>
> my @A = myobj::files::list(@params);
> foreach my $x ( @A ) {
> foreach my $y ( @$x ) {
> foreach my $z ( @$y ) {
> print "$z\n";
> }
> }
> }
>
>
> Other simplifications exist, which may or may not be appropriate to
> your situation. Here are some that would work with this (admittedly
> myopic) example:
>
> foreach my $x ( myobj::files::list(@params) ) {
> foreach my $y ( @$x ) {
> print "$_\n" foreach @$y;
> }
> }
>
>
> In much the same way that it's possible to program FORTRAN in any
> language, it's possible to program C in Perl. I recommend programming
> Perl in Perl. :-) An excellent book if you are interested in getting
> more into the idioms of programming Perl-as-Perl is "Perl Cookbook",
> 2nd Edition, by Torkington and Christiansen, published by O'Reilly.
> http://oreilly.com/catalog/9780596003135/
>
> Cheers,
> - Richard
>
>
--
The Toronto Linux Users Group. Meetings: http://gtalug.org/
TLUG requests: Linux topics, No HTML, wrap text below 80 columns
How to UNSUBSCRIBE: http://gtalug.org/wiki/Mailing_lists
More information about the Legacy
mailing list