Perl在替换中使用未初始化的值

时间:2013-02-27 16:57:16

标签: regex perl initialization substitution

为什么会产生错误:

使用未初始化的值$ match代替(s ///)...

my $sub = 0;  #added
my $m;  #added

open (FH1, "<FILE1.txt") || die $!;
open (FH2, "<FILE2,txt") || die $!;

my @strings = (<FH2>);  #each line of the file into an array
close FH2 or die $!;

my $here;
while ( my $url = <FH1> ) {
    chomp $url;

    foreach my $sub (@strings) {      
         my $repeat = 1; 
         while ((my $m = $_) =~ s|(?<![/])(?:[/](?![/])[^/]*){$repeat}[^/]*\K|$sub|)  #<-- Error states the error is occurring here
         {

              print "$m\n";   
              $repeat++;    

              push( @{ $here->{$url} }, $m ); 
         }        
    }
}

文件中肯定存在某些东西(因为我可以打印foreach循环中的每一行)并且正则表达式替换肯定有效,因为它在我尝试移动它之前已在其自己的程序中进行了测试进入这个计划。

我忽略了一些明显的东西吗?

非常感谢您的帮助,非常感谢

3 个答案:

答案 0 :(得分:4)

您永远不会向$_分配任何内容。

while ((my $match = $_) =~ ...

应该是

while ((my $match = $url) =~ ...

答案 1 :(得分:2)

正如错误所说,

$match未初始化。它设置为$_,未初始化 - 您明确提供循环变量($url$sub),因此在这种情况下隐式变量未初始化。

我认为你的意思是... ($match = $url) =~ s/the subst/.../ ...

答案 2 :(得分:0)

@strings有一个未初始化的字符串。您正在尝试使用此字符串(通过$sub)来替换正则表达式。确保@strings包含您想要的数据。