Perl регулярное выражение использование неинициализированного патча паттерна - PullRequest
0 голосов
/ 29 июня 2011

Мой скрипт загружает некоторые вещи из некоторых файлов в некоторых массивах, вы вводите текст с клавиатуры, скрипт ищет соответствующую часть текста в этих массивах, если он его находит, он что-то делает, если нет, ну, Другое дело, по крайней мере, в теории.

Я получаю следующие ошибки:

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 ]

1 голос
/ 29 июня 2011

Прежде всего, всегда полезно использовать строгую прагму - если только у вас нет веской причины избегать ее -.

Во-вторых, я не вижу инициализации $ plm3 в вашем коде,Возможно, вы забыли инициализировать его.

0 голосов
/ 29 июня 2011

Очевидно, есть некоторые проблемы с копированием / вставкой, которые сводят на нет мой первоначальный ответ.

Другие ошибки, большие и маленькие:

  • Вы не используете строгий. (роковой недостаток)
  • Ваш opendir используется один раз, затем никогда не закрывается.
  • Вы используете глобальные файловые дескрипторы вместо лексических (например, open my $fh, ...)
  • Использование полного цикла + splice вместо grep (@files=grep /^arr/i, @files)
  • Использование chomp($_), когда chomp per default chomps переменная $_
  • Я даже не знаю, что означает эта строка:

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

Похоже, вы используете сопоставление с шаблоном, где $_ - это шаблон (в данном случае это ... что? Ничего? Ничего?), Чье возвращаемое значение используется в качестве шаблона grep для ссылки на массив, что может или не может быть инициализирован. Очень ужасное утверждение. Если он действительно работает как задумано, читаемость очень низкая.

  • Перерасчет $/ кажется легкомысленным делом в этом контексте, но я не могу точно сказать, как сценарий заканчивается там.
0 голосов
/ 29 июня 2011

Я думаю, что вы назначаете что-то переменной $1 в строке 121

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...