http://qs1969.pair.com?node_id=27226


in reply to mybooks.pl

A couple of fixes and a couple of suggestions. First, the mkdir thing has a precedence problem, as tye suggests. Use parenthesis or or to fix it:
mkdir("$dir", 0777) || die "Could not mkdir \"$dir\": $!\n";
Second, the chop bothers me, 'cuz it's easy to grab something you don't want. (In this case, it's right, but I prefer chomp).

Third, there are a couple of other ways for doing your menu stuff. Some people prefer this:

($menu eq 1) && addwant(); ($menu eq 2) && addhave();
When I have to do something like this, I usually use a data structure of references:
my @actions = qw( \&addwant \&addhave ); # and so forth # get input if (defined (my $action = $actions[$menu])) { $action->(); } else { print "\n\n\nGoodbye!\n"; exit; }
Finally, if you want to clear the screen, there's a bit in perlfaq8 that might help. Not a big deal, though.

Replies are listed 'Best First'.
(zdog) RE: (2) mybooks.pl
by zdog (Priest) on Aug 10, 2000 at 09:23 UTC
    I liked your idea of using a data stucture of references, after all, I was trying to do something similar from the start, but my lack of Perl skill got in the way. Anyway, I put it into my code and there was a problem, but I fixed it by writing $actions[$menu-1] instead of $actions[$menu] since the options in the menu number from 1 to 5 while the elements of array @actions number from 0 to 4. However, I still get the following error:

    Can't use string ("\&addwant") as a subroutine ref while "strict refs" in use at mybooks.pl line 50, <STDIN> chunk 1.

    Is there any way to fix this other than by not using strict?

    Thanx.

    Zenon Zabinski | zdog | zdog7@hotmail.com

      Yes, the array of code references should not have been created using qw. That string-ifies the contents of the array, which means that you end up with an array containing ("\&addwant"), etc.

      Which isn't what you want. You want:

      my @actions = (\&addwant, \&addhave);