Perl regexp使用未初始化的模式修补程序

Perl regexp使用未初始化的模式修补程序,regex,perl,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 e

我的脚本从一些数组中的一些文件中加载一些内容,你从键盘输入一个文本,脚本在这些数组中搜索文本的相关部分,如果它找到了,它会做一些事情,如果没有,那么,至少在理论上是另一件事

我得到以下错误:

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)/;

我认为您在第121行为变量
$1
赋值首先,使用严格的pragma总是一个好主意,除非您有充分的理由避免它--


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

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

其他错误,无论大小:

  • 你不用严格的。(致命缺陷)
  • 您的opendir只使用一次,然后从未关闭
  • 您使用全局文件句柄,而不是词法(例如,
    打开我的$fh,
  • 使用complext循环+
    拼接
    而不是
    grep
    @files=grep/^arr/i,@files
  • 当chomp per default chomp时,使用
    chomp($)
    $变量
  • 我甚至不知道这句话是什么意思:

        if(grep $stare  =~ m/$_/i, @{$1}) {
    
您似乎正在使用一个模式匹配,其中,
$\uu
是模式(在本例中是..什么?什么都没有?什么?),其返回值用作数组引用的grep模式,可以初始化也可以不初始化。非常可怕的声明。如果它确实按预期工作,那么可读性很低

  • 在这种情况下,重新声明
    $/
    似乎是一件轻浮的事情,但我真的不知道,因为脚本到此结束

与你的问题无关,但是如果你想匹配一个文本
.txt
,你需要在正则表达式中转义点:
/arr(\w+\.txt)/
。你应该使用strict并停止摆弄符号引用:
push(@{$1},$)。是你想出了这个计划,还是你从网上的某个地方复制了代码?我想到了,我想根据硬盘上现有的文件名动态生成数组drive@Benca使用显式变量名几乎总是比不使用好。例如:
{$file{$1}}
{$1}
@TLP好得多,好吧,我也会试试,但我仍然不清楚,为什么我的代码中除了一个以外的所有事件都可以这么做:(,是的,第一次我写的时候很严格,但是当我更改它以动态方式获取文件和数组名时,我不得不放弃它,比如,{$1})没有使用strictright,我初始化了$plm3,并在emo_full_dynamic.pl第120行,区块2中去掉了模式匹配中未初始化的值(m/)。现在我只剩下“修改emo_full_dynamic.pl第121行,区块2中尝试的只读值”。第120行=$plm3=~/arr_(\w+.txt)/;@Benca Lucian:strict阻止你做像{$1}这样的事情是有原因的;通常很糟糕的计划会让你使用符号引用。只需使用一个散列:my%arrays;push{$arrays{$1},[…],例如是一种更好的方法。请参阅Perl文档中的perlref和perlreftut。该部分打开具有特定名称格式的文件,然后生成具有类似名称的数组,并将数据从文件加载到这些数组。奇怪的是,第一个“{”不是在我的代码中,可能是从编辑器到帖子的复制/粘贴和重新身份验证,这部分工作正常,事实上,除了最后一部分,所有部分都工作正常lines@Benca修复我在更新的答案中提到的其他问题。然后,请使用完整的复制/粘贴来编辑您的问题以包含新代码。@Benca,最重要的是,添加
use strict;使用警告;
修复错误似乎需要做很多工作,但实际上,由于隐藏的错误变得可见,您最终节省了很多时间。@Benca哦,对不起,我看到您在使用警告。那么,添加
strict
。出于上述原因,我不能使用strict,我确实使用了警告,代码中就有:),关闭DIR句柄不是问题的一部分,“if(grep$stare=~m/$\u/i,@{$1})”当输入的字符数大于或小于我要查找的实际字符串时,这可以让我获得匹配,有很多其他验证不是问题的一部分,所以我没有发布它们,因为可读性很低,但毕竟是perl:P,我需要重新声明$/以便我可以从一些具有不同se的文件中读取元素不过,谢谢你的其他建议,非常感谢
    if(grep $stare  =~ m/$_/i, @{$1}) {