Perl - 未初始化的变量

时间:2013-08-22 10:38:02

标签: perl file variables initialization

发生了什么事?我创建了一个简单的程序来读取文件中的行和打印输出。但它会引发一些错误......

以下是代码及其解释:

use warnings;
use List::MoreUtils qw(indexes);

my @array_words = ();
my @array_split = ();
my @array_of_zeros = (0);
my $index = 0;

open my $info, 'models/busquedas.csv';
open my $model, '>>models/model.txt';

#First while is to count the words and store it into an array
while( my $line = <$info>)  {
    @array_split = regex($line);
    for (my $i=0; $i < scalar(@array_split); $i++) {
            # Get the index if the word is repeated
        $index = indexes { $_ eq $array_split[$i] } $array_words[$i];
            # if the word is not repeated then save it to the array by 
            # checking the index
        if ($index != -1){ push(@array_words, $array_split[$i]); }
    }
}

print $model @array_words;

sub regex{
    # get only basic info like: 'texto judicial madrid' instead of the full url
    if ($_[0] =~ m/textolibre=/ and 
        $. < 3521239 && 
        $_[0] =~ m/textolibre=(.*?)&translated/) {
        return split(/\+/, $_[0]);
    }
}

我不理解的错误是:

Use of uninitialized value $index in numeric ne (!=) at classifier.pl line 21, <$info> line 12216.
Use of uninitialized value $index in numeric ne (!=) at classifier.pl line 21, <$info> line 12216.
Use of uninitialized value $index in numeric ne (!=) at classifier.pl line 21, <$info> line 12216.
Use of uninitialized value $index in numeric ne (!=) at classifier.pl line 21, <$info> line 12217.
Use of uninitialized value $index in numeric ne (!=) at classifier.pl line 21, <$info> line 12217.
Use of uninitialized value $index in numeric ne (!=) at classifier.pl line 21, <$info> line 12217.
Use of uninitialized value $index in numeric ne (!=) at classifier.pl line 21, <$info> line 12217.
Use of uninitialized value $index in numeric ne (!=) at classifier.pl line 21, <$info> line 12217.
Use of uninitialized value $index in numeric ne (!=) at classifier.pl line 21, <$info> line 12218.
Use of uninitialized value $index in numeric ne (!=) at classifier.pl line 21, <$info> line 12218.

为什么未初始化$index?我已声明它并用0值初始化它! 我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您已将变量初始化为零,但随后使用

更改其值
$index = indexes { $_ eq $array_split[$i] } $array_words[$i];

该函数可能返回undef(因为$array_words[$i]不是eq $array_split[$i])。否则它将返回一个,因为列表中只有一个元素。

顺便说一句,如果你不需要在循环之外使用它的值,那么在循环之外初始化变量是一种不好的做法。您可以在my $index填充它的同一行声明indexes

答案 1 :(得分:0)

正如已经观察到的那样,indexes子程序不能像那样工作。它返回索引的列表,块的计算结果为 true 。在像这样的标量上下文中使用它是错误的。

如果您要使用库,则需要any - 也来自List::MoreUtils。代码看起来像这样

while( my $line = <$info>)  {
    @array_split = regex($line);
    for my $word (@array_split) {
      push @array_words, $word unless any { $_ eq $word } @array_words;
    }
}

但是我觉得你想要更简单的东西。根据我对您的代码的理解,Perl哈希将满足您的需求。

我已经像这样重构了你的程序。我希望它有所帮助。

基本上,如果行中的每个“单词”都不在哈希值中,则会将其推送到@array_words

您的regex子例程中似乎也有错误。声明

return split(/\+/, $_[0]);

拆分整行并返回结果。我认为它应该只拆分你刚刚提取的URL的查询部分,比如这个

return split /\+/, $1;

通常,您应该检查open次呼叫是否成功。添加autodie pragma会隐式执行此操作。

use strict;
use warnings;
use autodie;

open my $info,  '<',  'models/busquedas.csv';
open my $model, '>>', 'models/model.txt';

my %unique_words;
my @array_words;

#First while is to count the words and store it into an array
while( my $line = <$info>)  {
  for my $word (regex($line)) {
    push @array_words, $word unless $unique_words{$word}++;
  }
}

print $model "$_\n" for @array_words;

sub regex {

  my ($line) = @_;

  # get only basic info like: 'texto judicial madrid' instead of the full url
  return unless $line =~ /textolibre=/ and $. < 3521239;
  if ( $line =~ /textolibre=(.*?)&translated/ ) {
    return split /\+/, $1;
  }
}