【问题标题】:Perl Use of uninitialized value in substitutionPerl 在替换中使用未初始化的值
【发布时间】:2013-02-28 01:24:27
【问题描述】:

为什么会产生错误:

在 ... 处使用未初始化的值 $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 循环中的每一行)并且正则表达式替换肯定有效,因为它已经在自己的程序中进行了测试,然后我尝试将它移动到这个程序。

我忽略了什么明显的东西吗?

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

【问题讨论】:

  • 感谢正确缩进代码
  • 抱歉,感谢提醒

标签: regex perl initialization substitution


【解决方案1】:

您永远不会为$_ 分配任何东西。

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

应该是

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

【讨论】:

  • 很明显我当时忽略了一些东西,感谢您的帮助
【解决方案2】:

$match 未初始化,如错误所示。它设置为$_,它是未初始化的——您显式提供循环变量($url$sub),因此在这种情况下不会初始化隐式变量。

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

【讨论】:

  • 很明显我当时忽略了一些东西,感谢您的帮助
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2016-09-25
    • 1970-01-01
    • 2013-04-08
    相关资源
    最近更新 更多