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

She*_*don 4 perl

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

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

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

open (DATA, $ARGV[1]);
my @file = <DATA>;
print @file;
Run Code Online (Sandbox Code Playgroud)

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

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

Eri*_*rom 15

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

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

foreach my $line (@file) {$line =~ s/find/replace/}
Run Code Online (Sandbox Code Playgroud)

或者更简洁地说:

s/find/replace/ for @file;
Run Code Online (Sandbox Code Playgroud)

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

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

my $file = do {local $/; <DATA>};
Run Code Online (Sandbox Code Playgroud)

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

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

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

my $file = do {local $/; <$DATA>};
Run Code Online (Sandbox Code Playgroud)