Perl错误在替换中使用未初始化的值$ _(s ///)

时间:2016-09-16 21:40:37

标签: perl

问候我尝试在本教程之后将文件读入哈希哈希值。

http://docstore.mik.ua/orelly/perl/prog3/ch09_04.htm

我的文字输入文件是

event_a1_x1: email1=xxx@gmail.com email2=yyy@gmail.com email1_cnt=3 
event_a1_x2: email1=xxx@gmail.com email2=yyy@gmail.com email1_cnt=3 
event_b2_y1: email1=xxx@gmail.com email2=yyy@gmail.com email1_cnt=3 
event_b2_y2: email1=xxx@gmail.com email2=yyy@gmail.com email1_cnt=3 
event_c3_z1: email1=xxx@gmail.com email2=yyy@gmail.com email1_cnt=3 
event_c3_z2: email1=xxx@gmail.com email2=yyy@gmail.com email1_cnt=3

我的代码是

#!/usr/bin/perl
use strict;
use warnings;

my $file = $ARGV[0] or die "Need to get config file on the command line\n";

open(my $data, '<', $file) or die "Could not open '$file' $!\n";

my %HoH;
#open FILE, "filename.txt" or die $!;
my $key;
my $value;
my $who;
my $rec;
my $field;

while ( my $line = <$data>) {
    print $line;
    next unless (s/^(.*?):\s*//);
    $who = $1;
    #print $who;
    $rec = {};
    $HoH{$who} = $rec;
    for $field ( split ) {
        ($key, $value) = split /=/, $field;
        $rec->{$key} = $value;
    }
}

我一直收到这个错误...

Use of uninitialized value $_ in substitution (s///) at ./read_config.pl line 18, <$data> line 1. 

1 个答案:

答案 0 :(得分:5)

这是关于设置和使用$_,“默认输入和模式搜索空间”的时间。

while (<$fh>)中,从文件句柄中读取的内容已分配给$_。然后,您的正则表达式s///print以及split可以使用它。请参阅General Variables in perlvar

但是,一旦我们专门分配给变量while (my $line = <$fh>),此交易就会被取消,$_也未设置。因此,当您稍后以依赖$_的方式使用正则表达式替换时,会找到变量uninitialized

要么始终使用默认$_,要么(始终)不使用默认值while (<$fh>) { print; # same as posted } 。所以,要么

while (my $line = <$fh>) {
    # ...
    next unless $line =~ s/^(.*?):\s*//;
    # ...
    foreach my $field (split ' ', $line) {
        # ...
    }
}

$url = "https://openapi.etsy.com/v2/listings/";

可以在代码中进行更多改进,但这会将我们带到其他地方。