Обработка ошибок с неверной записью MAC с модулем Perl Net :: MAC - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь написать Perl-скрипт, который просит пользователя ввести MAC-адрес.Я использую модуль Net :: MAC для преобразования любого формата MAC-адреса, который вводит пользователь, в стандартный формат, который я буду использовать позже в сценарии.У меня большая часть работает, но я не могу понять, как справиться с ситуацией, когда они вводят недопустимый MAC.То, что не может быть MAC-адресом.Например, запись, которая содержит буквы, не являющиеся AF.

Я думаю, что-то вроде следующего должно работать, но когда оно умирает, оно просто уничтожает весь сценарий, а не повторно просит пользователя ввестиMAC снова.

    use Net::MAC;

    my $proceed = "no";
    while ($proceed eq "no"){
        print "Enter the MAC address: ";
        my $mac;
        $mac = <>;
        chomp($mac);
        my $tempMac = Net::MAC->new('mac' => $mac, 'die' => 0);
        if ($tempMac->die() eq "0"){
            print "Looks like you entered an invalid MAC address.  Please try again.\n";
        } else {
            my $newMac = $tempMac->convert('base' => 16,'bit_group' => 8,'delimeter' => ":");
            $proceed = "yes";
        }
    }

Следует ли вместо этого использовать что-то вроде оператора Try, Catch?Другими словами, мне нужно знать, как правильно обрабатывать событие die (), не вызывая сценария для меня.

1 Ответ

0 голосов
/ 09 октября 2018

См. https://mvp.kablamo.org/essentials/die-eval для получения некоторой информации о том, как исключения работают в Perl и как их обрабатывать.Рассмотрим Синтаксис :: Keyword :: Try для знакомой парадигмы try / catch.

use Syntax::Keyword::Try;
my $newMac;
try {
    my $tempMac = Net::MAC->new('mac' => $mac);
    $newMac = $tempMac->convert('base' => 16,'bit_group' => 8,'delimeter' => ":");
    $proceed = "yes";
} catch {
    print "Looks like you entered an invalid MAC address. Error: $@ Please try again.\n";
}

Вы также можете проверить MAC-адрес перед передачей его в Net :: MAC, используя что-то вроде Regexp :: Common .

use Regexp::Common 'net';
my $newMac;
if ($mac =~ m/$RE{net}{MAC}/) {
    my $tempMac = Net::MAC->new('mac' => $mac);
    $newMac = $tempMac->convert('base' => 16,'bit_group' => 8,'delimeter' => ":");
    $proceed = "yes";
} else {
    print "Looks like you entered an invalid MAC address. Please try again.\n";
}
...