Perl regexp使用未初始化的模式补丁

时间:2011-06-29 07:31:56

标签: regex perl

我的脚本从某些数组中的某些文件加载​​一些东西,你从键盘输入一个文本,脚本搜索那些数组中文本的相关部分,如果找到它,它会做什么,如果没有,那么,另一件事,至少在理论上。

我收到以下错误:

Use of uninitialized value in pattern match (m//) at emo_full_dynamic.pl line 120, <STDIN> chunk 2.
Modification of a read-only value attempted at emo_full_dynamic.pl line 121, <STDIN> chunk 2.
line 120 =  $plm3 =~ /arr_(\w+.txt)/;

我认为我的问题是$plm3 =~ /arr_(\w+.txt)/;。我使用它,以便我可以在$1中存储数组的名称。

这是我的代码:

#!/usr/bin/perl
use warnings;

$idx = 0;
$oldsep = $/;

opendir(DIR, 'c:/downloads/text_files/arrs/');
@files = readdir(DIR);

while ($idx <= $#files )
    {
      $value = $files[$idx];
      if ( $value !~ m/^arr/i)
        {
           splice @files, $idx, 1;
         }
      else
        {
          $idx++;
         }
     }

foreach $plm (@files)
  {
    if($plm =~ m/txt$/)
      {
        open(ARR, "C:/downloads/text_files/arrs/$plm") or die $!;
        while(<ARR>)
          {             {
        chomp($_);
            $plm =~ m/arr_(\w+).txt/;
            push(@{$1}, $_);
           }
        close ARR;
       }
   }

$plm = 0;
$idx = 0;

$stare = <STDIN>;
chomp($stare);
while($stare)
    {
      foreach $plm2 (@files)
        {
        if($plm2 =~ m/txt$/)
              {
                $plm2 =~ m/arr_(\w+).txt/;
                if(grep $stare  =~ m/$_/i, @{$1})
                  {
                    $flag = 1;
                   }

                else
                  {
                $flag = 0;
                   }
              }
          }

        if($flag == 1)
          {
            $/ = "%\n";
            $plm3 =~ /arr_(\w+.txt)/;
            open SUPARARE, "C:/downloads/text_files/replies/$1" or die $!;
            etc etc....

3 个答案:

答案 0 :(得分:1)

首先,使用严格的编译指示总是一个好主意 - 除非你有正当理由避免它 - 。

其次,我没有在你的代码中看到$ plm3初始化。你可能忘了初始化它。

答案 1 :(得分:0)

我认为你在121行

上为变量$1分配了一些东西

答案 2 :(得分:0)

显然有一些复制/粘贴问题否定了我的初步答案。

其他错误,无论大小:

  • 你不使用严格。 (致命缺陷)
  • 您的opendir使用一次,然后从未关闭。
  • 您使用全局文件句柄,而不是词汇(例如open my $fh, ...
  • 使用Complext循环+ splice代替grep@files=grep /^arr/i, @files
  • 每次默认选择时使用chomp($_)会选择$_变量
  • 我甚至不知道这条线是什么意思:

        if(grep $stare  =~ m/$_/i, @{$1}) {
    

你似乎正在使用模式匹配,其中$_是模式(在这种情况下是......什么?没什么?有什么?),其返回值用作数组引用的grep模式,可能会或可能不会被初始化。一个非常可怕的声明。如果它确实按预期工作,则可读性非常低。

  • 在这种情况下,重新声明$/似乎是一件无聊的事情,但我无法说出来,因为剧本在那里结束。