cesapun has asked for the wisdom of the Perl Monks concerning the following question:

##################Setting category########################## if ($release_name =~ m/(Lz0|PLATO)/i) { print "[INFO] Category : Apps\n"; $category = "Apps"; #do smth } if ($release_name =~ m/(SKIDROW|POSTMORTEM|RELOADED|THETA|TiNYiSO| +HI2U|TE|FLT|PROPHET|Unleashed|OUTLAWS|ALiAS|JAGUAR)/i) { print "[INFO] Category : Games\n"; $category = "Games"; #do smth } if ($release_name =~ m/(DVDRip.XviD|dvdrip.xvid|TS|CAM|R5.XviD)/i) + { print "[INFO] Category : XviD\n"; $category = "XviD"; #do smth } if ($release_name =~ m/BluRay.x264/i) { print "[INFO] Category : HD x264\n"; $category = "HD x264"; #do smth } if ($release_name =~ m/DVDR/i) { print "[INFO] Category : XviD\n"; $category = "XviD"; #do smth } if ($release_name =~ m/(BRRIP.x264|BRRIP x264)/i) { print "[INFO] Category : XviD\n"; $category = "XviD"; #do smth } } if ($release_name =~ m/(BRRIP.XviD|BDRip.XviD)/i) { print "[INFO] Category : XviD\n"; $category = "XviD"; #do smth } if ($release_name =~ m/Update/i) { print "[INFO] Category : Misc\n"; $category = "MIsc"; #do smth } if ($release_name =~ m/(HDTV.XviD|HDTV.x264|PDTV.x264)/i) { print "[INFO] Category : Episodes\n"; $category = "Episodes"; #do smth }

Instead of all those IFs ,how can i make this part of code shorter ?

Also,if $release_name is(ie) "The.Avengers.2012.720p.BluRay.x264.DTS-HDChina" ,when i run the script,i get:

[INFO] Category : XviD [INFO] Category : HD x264
.

Matched xvid because of TS from DTS.I want it to match only INFO Category : HD x264

Many thanks in advance.

Replies are listed 'Best First'.
Re: if,if and again,if
by moritz (Cardinal) on Aug 21, 2012 at 09:54 UTC

    You can try a data-driven approach:

    my @matchers = ( qr/(Lz0|PLATO)/i, 'Apps', qr/(SKIDROW|POSTMORTEM|RELOADED|THETA|TiNYiSO|HI2U|TE|FLT|PROPHET| +Unleashed|OUTLAWS|ALiAS|JAGUAR)/i, 'Games', ... ); for (my $idx = 0; $i < @matchers; $i += 2) { if ($release_name =~ $matchers[$i]) } $category = $matchers[$i + 1]; print "[INFO] Category: $category"; last; # stop after the first category was found } } # code not tested

      Data-driven approaches FTW!

      Though I'd be tempted to do things a bit more perlishly (at least for my own definition of perlish):

      my @matchers = ( [ qr/(Lz0|PLATO)/i => 'Apps' ], ... ); for my $check (@matchers) { if ($release_name =~ $check->[0]) { $category = $check->[1]; print "[INFO] Category: $category\n"; last; } }
      Actually, a bit more perlish, IMO, would be to replace that for loop altogether:
      use List::Util qw(first); my $category = map { $_ ? $_->[1] : undef; } first { $release_name =~ $_->[0]; } @matchers; if ($category) { print "[INFO] Category: $category\n"; } else { print "[ERROR] Unrecognised release type: $release_name\n"; }
      But maybe that's just me. :-)

        If we go all perlish, I'd get rid of the ugly map with a ternary :-). Either

        my $category = first { ... } ... ; if ($category) { $category = $category->[1]; print "[INFO] Category: $category\n"; }

        Or if you insist on a map on a one-element list, write it as

        map $_->[1], grep $_, first { .... } ...;

        IMHO several simple operations are easier to read than a few complicated ones.

      Many thanks.That works.

      Close this.
Re: if,if and again,if
by nemesdani (Friar) on Aug 21, 2012 at 09:29 UTC
    With or for example.
    A . has a special meaning, by the way. Look it up.
    And this isn't a tutorial, you posted in the wrong section.
    And it's not elegant letting everybody know that you're dowloading films illegally.

    I'm too lazy to be proud of being impatient.

      And it's not elegant letting everybody know that you're dowloading films illegally.

      assume much? :)

A reply falls below the community's threshold of quality. You may see it by logging in.