发生了什么事?我创建了一个简单的程序来读取文件中的行和打印输出。但它会引发一些错误......
以下是代码及其解释:
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值初始化它!
我该如何解决这个问题?
答案 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;
}
}