http://qs321.pair.com?node_id=821788


in reply to How's My Style Now?

Overall it's consistent and readable, but for minor nit picks I choose this line:
print redirect($scripts->{'musing'}->{'script'} . '?musing_id=' . $musing_id);
Drop unnecessary quoting of hash keys, prefer interpolation to dot concatenation. This, less noisy:
print redirect("$scripts->{musing}{script}?musing_id=$musing_id");

Replies are listed 'Best First'.
Re^2: How's My Style Now?
by Spenser (Friar) on Feb 08, 2010 at 15:28 UTC

    I agree with your suggestion here. However, let me tell you a little about the genealogy of this bit of code, because there's another stage to come and I'd like a suggestion about how to complete this. For links I used to have something like this:

    a({href=>"/cgi-bin/musing.cgi?musing_id=$musing_id"}, $musing_heading)

    This worked fine for a long time. However, I would change occasionally the name of a script or move it to a different directory. For example, musing.cgi used to be called web_log.cgi. Then I'd have to go through my scripts and other places where script names were contained and change it. Last year I came up with the idea of entering the names of all of my scripts in a table in MySQL I named site_scripts. Now if I want to change the name of a script or location of a script, I change it in my site_scripts table in MySQL. I just use the same key name (e.g., musing) to retrieve it. This has worked well for me so far.

    Now what I want to do is to add the particular ID for the script. For instance, for a musing I generally have musing_id as the CGI variable name. For it, I'd like to change '?musing_id=' to something less hard-coded to something like this:

    a({href=>scripts->{'musing'}->{'script'} . '?' . script_ids->{'musing'}->{'id'} . '=' $musing_id}, $musing_heading)

    To tighten this up more, and to reduce the interpolation you mention, I could add the ? and the = to the hash containing the id label. Of course, once I have this problem worked out, I can have a sub-routine for my hyperlinks: hyperlink('musing',$musing_id,$musing_heading)

    That would be so much nicer, wouldn't it? It would be simple to set up another column in my site_scripts table in MySQL to hold the ID label. However, for some scripts I need more than one CGI variable: /cgi-bin/musing.cgi?musing_id=$musing_id&ref_id=$ref_id. That might also through off my hyperlink() idea. So, any suggestions on how I might organize multiple ID possibilities in MySQL or how to sort through them in Perl when deployed with a function?

    -Spenser

    That's Spenser, with an "s" like the detective.

      You could put all the link particulars in a module so that changes can be made in one place. Here is a Links.pm to give you ideas. It would be better to go a step further and have the module read a configuration file, but I didn't want to spoil all your fun.

      If you only have a handful of links to maintain, a database may be overkill. By putting this in a module, you should be able to make the change from a config file to database with little, if any, change in the calling scripts.

      #!/usr/bin/perl package Links; use strict; use CGI qw(:standard); my $Links = { musings => { text => 'Musings', link => '/cgi-bin/musing.cgi', id_list => [ 'musing_id', ], }, rants => { text => 'Rants', link => '/cgi-bin/rants.cgi', id_list => [ 'rant_id', 'ref_id', ], }, stuff => { text => 'Other Stuff and Junk', link => '/cgi-bin/misc.cgi', id_list => [ ], }, }; #----------------------------------------------------------- sub make { my $key = shift; my $vals = shift; (defined($Links->{$key})) or return; my $info = $Links->{$key}; my @id_list; for my $id (@{$info->{id_list}}) { if (defined($vals->{$id})) { push @id_list, "$id=$vals->{$id}"; } else { # what if? } } my $url = $info->{link}; if (@id_list) { my $id_str = join('&', @id_list); $url = "$url?$id_str"; } return a({-href=>$url}, $info->{text}); } 1;
      #!/usr/bin/perl use strict; use Links; my $vals = { musing_id => 42, rant_id => 1, ref_id => 2, foo_id => 3, }; my $link = Links::make('musings', $vals) or die; print "$link\n"; my $link = Links::make('rants', $vals) or die; print "$link\n"; my $link = Links::make('stuff', $vals) or die; print "$link\n";