我有一个子程序,它在第一次被调用时起作用,但是第二次,如果URL无效,它使用前一个值$1
。是否有一种简单的方法可以使$1
的值保持不变或等于NULL值?
编辑:这是我的代码
our %hash;
sub GetOnce{
$mech->get($_[0]);
$val = $mech->content;
$val =~ /value="(.*?)"/;
if($1 ne "") {$hash{$_[1]} = $1;}
}
GetNonce("http://URL1", "VAR1"); #Valid URL
GetNonce("http://URL2", "VAR2"); #Timesout
我只想重置错误处理的值。即如果URL1有效但URL2无效或超时,则$1
对于它们都是相同的。如果URL1无效/超时且URL2有效,则仅保存URL2中的$ 1。如果它们都有效,那么程序会存储它们的每个$ 1。
答案 0 :(得分:5)
我建议不要使用$1
,而是使用
my ( $match ) = ( $val =~ m/value="(.*?)"/ );
像这样的模式匹配的有用功能 - 在标量上下文中,它是'true / false'但是在列表上下文中,它返回匹配列表。然后您可以将其分配给各个标量。
所以无论如何 - $match
如果匹配失败则为undef
,如果匹配失败则为defined
。您应该使用$match
来测试这一点,因为如果0
中的值为''
或our %hash;
sub GetOnce{
my ( $url, $key ) = @_;
$mech->get($url);
my ( $match ) = ( $mech -> content =~ m/value="(.*?)"/ );
#may not need to test it - you could just have an undef value.
if ( defined $match ) { $hash{$key} = $match };
}
,则 尽管有工作,但是是假的。
E.g:
{{1}}
答案 1 :(得分:3)
您应该测试正则表达式匹配本身,而不是捕获的值。最好命名 @_
中的值,并在正则表达式中使用补充字符类而不是非贪婪匹配。
喜欢这个
our %hash;
sub get_once {
my ($url, $key) = @_;
$mech->get($url);
my $content = $mech->content;
$hash{$key} = $1 if $content =~ /value="([^"]*)"/;
}