Chris
Chris

Reputation: 119

Perl 5.12.4, Switch not working?

I am new to perl, and am trying out code which uses a simple switch. The school server runs only Perl 5.12.4, so I am coding accordingly.

The issue I am having is that the variable controlling the switch will not throw any of the cases, no matter how I describe them, and is always falling through to the default case.

Ignore the contents of each case switch, I am just trying to get it to throw the print command at least so I know that the switch is operating.

# I have tried: case "1", case 1, case [1], case '1', and other variations.

#!/usr/bin/perl
# script name: phonebook.pl
while ( 1 ) {
print "Welcome to the Registry Searcher!\n";
print "Please enter a command matching one of the options below.\n";
print "1) List records alphabetically\n";
print "2) List records reverse alphabetically\n";
print "3) Search the Registry by Name\n";
print "4) Search the Registry by Birthday\n";
print "5) Exit\n";
print "Choice: ";
$in = <>;
    # user enters "1".
use Switch;
switch ($in) {
    case 1 {
        print "Please choose either first or last name (f/l): ";
        $type = <>;
        if ( $type == f ) {
            sort list.txt;
        } elsif ( $type == "l" ) {
            sort -k2 list.txt;
        } else {
            print "Choice not recognized.\n";
        }
        print "Please press enter to continue...";
        $cont = <>;
    }
    case 2 {
        print "Please choose either first or last name (f/l): ";
        $type = <>;
        if ( $type == "f" ) {
            sort -r list.txt
        } elsif ( $type == "l" ) {
            sort -rk2 list.txt
        } else {
            print "Choice not recognized.\n";
        }
        print "Please press enter to continue...";
        $cont = <>;
    }
    case 3 {
        print "Please enter a last name to search for: ";
        $name = <>;
        # awk '/^[A-Z][a-z]+ '$name'/{print}' list.txt;
        print "Please press enter to continue...";
        $cont = <>;
    }
    else {
    print "not found\n";
    }
}
}

Upvotes: 2

Views: 518

Answers (2)

LeoNerd
LeoNerd

Reputation: 8532

You really don't want to be using Switch; that's a very old source-filter module that's unreliable, and in any case was removed from Perl a long time ago.

For better modern alternatives see Switch::Plain, or the given/when built-in operators, though beware of the latter's behaviour with "experimental" warnings.

Upvotes: 3

Casimir et Hippolyte
Casimir et Hippolyte

Reputation: 89574

You must add chomp($in); before the switch to remove the newline.

<> read a line in a stream and include the linefeed, the behaviour is different from a scanf-like function.

Upvotes: 4

Related Questions