Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Perl Net::MAC模块处理无效MAC项时出错_Perl_Error Handling_Scripting - Fatal编程技术网

使用Perl Net::MAC模块处理无效MAC项时出错

使用Perl Net::MAC模块处理无效MAC项时出错,perl,error-handling,scripting,Perl,Error Handling,Scripting,我正在尝试编写一个Perl脚本,要求用户输入MAC地址。我正在使用Net::MAC模块将用户输入的任何格式的MAC地址转换为标准格式,以便稍后在脚本中使用。我已经让它大部分工作,但我似乎不知道如何处理的情况下,他们进入一个无效的MAC。不可能是MAC地址的东西。例如,包含非A-F字母的条目 我认为下面的方法应该可以工作,但当它死掉时,它会完全杀死整个脚本,而不是再次要求用户进入MAC use Net::MAC; my $proceed = "no"; while ($p

我正在尝试编写一个Perl脚本,要求用户输入MAC地址。我正在使用Net::MAC模块将用户输入的任何格式的MAC地址转换为标准格式,以便稍后在脚本中使用。我已经让它大部分工作,但我似乎不知道如何处理的情况下,他们进入一个无效的MAC。不可能是MAC地址的东西。例如,包含非A-F字母的条目

我认为下面的方法应该可以工作,但当它死掉时,它会完全杀死整个脚本,而不是再次要求用户进入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";
        }
    }
使用Net::MAC;
我的$procedure=“否”;
而($“否”){
打印“输入MAC地址:”;
我的$mac;
$mac=;
咀嚼(mac美元);
我的$tempMac=Net::MAC->new('MAC'=>$MAC,'die'=>0);
如果($tempMac->die()等式“0”){
print“看起来您输入的MAC地址无效。请重试。\n”;
}否则{
我的$newMac=$tempMac->convert('base'=>16,'bit_group'=>8,'delimeter'=>“:”);
$procedure=“是”;
}
}
这是否应该使用类似于Try,Catch语句的语句?换句话说,我想我需要知道如何正确地处理die()事件,而不让脚本完全依赖于我。

有关异常在Perl中如何工作以及如何处理它们的一些信息,请参阅。考虑一个熟悉的尝试/捕捉范例。

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之前,您还可以使用类似的方法验证mac地址


根据它的文档,Net::Mac对象没有
die
方法。。。无效地址会发生什么情况?任何错误信息等?如果我输入虚假信息,我会得到如下信息:;39568jkl:“发现MAC地址元数据失败,MAC地址中的无效字符”00:00:39:56:8j:kl“at./RTTest.pl第124行”我希望能够对其进行测试并循环,要求用户再次输入MAC地址。我需要坐下来实际玩代码,但此模块中的错误处理非常奇怪。当die为0时,它只存储一条错误消息,并继续尝试执行它的操作,从而导致更多错误。如果die为0,verbose为1,它将使用carp打印错误,但是如果die为0,它不应该发出嘎嘎声。看起来您应该使用
$tempMac->get_error()
并查看它是否返回
undef
,以检查是否有错误。我想知道
tempMac->die()
是否正在调用内置的
die
。。。
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";
}