首页 > 解决方案 > Perl 在警告时在正则表达式编译中使用未初始化的值

问题描述

我在下面粘贴了一小段代码:

#!/usr/bin/perl

use strict;
use warnings;
use autodie;

my $start_data;
my $name = "Data_abc";

while(<DATA>){
    my $line = $_;
    if ($line =~ /^Start:\s+/){
        my ($st, $data) = split(/\s+/,$line); 
        $start_data = $data; 
    }

    for( $name ){
        /^$start_data/ and do { next; }
    }

    print "END of execution\n";
}
print $start_data;

__DATA__
===============================
2020-05-20            Name
===============================
Start:              Data_abc
Load:               Load_data

脚本按预期工作,但它会引发警告 -

Use of uninitialized value $start_data in regexp compilation at storage_problem.pl line 18,

既然我一开始就已经声明$start_data了,为什么会显示这个警告?

标签: perl

解决方案


$start_data已声明,但您在尝试在正则表达式中读取它之前没有为其分配值。因此,它是未定义的。

当我运行您的代码时,我收到 3 条警告消息,对应于您的DATA. 这 3 行与您的正则表达式不匹配(它们不以 开头Start:)。

由于您没有$start_data使用值进行初始化,因此您会收到uninitialized警告。

读取第 4 行后,您将停止收到警告,因为$start_data分配了一个值 ( Data_abc)。


推荐阅读