如何在Perl中访问Regex中的数组

时间:2011-01-29 03:14:24

标签: perl

我有两个输入读入我的命令提示符,第一个是由我正在编写的程序搜索的一系列单词,第二个是包含要找到单词的位置的文件。因此,例如,我的命令提示符读取perl WebScan.pl字WebPage000.htm

现在,我可以轻松访问这些输入中的任何一个进行打印,但是我很难访问网页的内容,因此我可以执行正则表达式来删除html标记并访问内容。我意识到有一个子程序可以做到这一点,没有正则表达式更有效,但我需要使用正则表达式:(。

我可以毫无困难地访问html文件进行打印:

open (DATA, $ARGV[1]);
my @file = <DATA>;
print @file;

打印html页面的整个代码,但我无法传递正则表达式以删除html块。我一直收到一条错误,上面写着“无法修改s /// near中的数组取消引用”,这是我具有特定正则表达式的地方。我不知道如何解决这个问题 - 我已经尝试将数组转换为标量但是我根本无法访问html中的任何数据(并且不,它不仅仅打印数量数组中的值:P)

如何访问数组的内容,以便使用正则表达式来优化所需的输出?

1 个答案:

答案 0 :(得分:15)

听起来你正在做@file =~ s/find/replace/;之类的事情。您正在收到该错误,因为正则表达式绑定运算符的左侧对其参数强加了标量上下文。标量上下文中的数组返回其长度,但此值是只读的。所以当你的替换尝试执行替换时,kaboom。

为了处理文件的所有行,您可以使用foreach循环:

foreach my $line (@file) {$line =~ s/find/replace/}

或更简洁地说:

s/find/replace/ for @file;

但是,如果您在HTML文件上运行正则表达式,则可能需要它们匹配多行。你上面做的是读取整个文件,并将每一行存储为@file的元素。如果在阵列上使用Perl的迭代控制结构之一,则无法匹配多条线。所以你应该把文件读成一个标量。然后,您可以按预期使用$file =~ s///

您可以通过暂时清除输入记录分隔符$/将文件粘贴到单个变量中:

my $file = do {local $/; <DATA>};

一般来说,正则表达式是解析HTML的错误工具,但听起来这是一个家庭作业,所以在这种情况下它只是练习。

最后,在现代Perl中,您应该使用open的三个参数形式,并使用词法文件句柄和错误检查:

open my $DATA, '<', $ARGV[1] or die "open error: $!";

my $file = do {local $/; <$DATA>};