Perl:重置$ 1变量

时间:2015-03-02 21:29:03

标签: perl

我有一个子程序,它在第一次被调用时起作用,但是第二次,如果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。

2 个答案:

答案 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="([^"]*)"/;
}