gpt4 book ai didi

perl - 如何在 Perl 中为 Regex 访问数组

转载 作者:行者123 更新时间:2023-12-04 22:00:54 24 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

听起来你正在做类似 @file =~ s/find/replace/; 的事情.您收到该错误是因为正则表达式绑定(bind)运算符的左侧对其参数施加了标量上下文。标量上下文中的数组返回其长度,但该值是只读的。因此,当您的替换尝试执行替换时,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>};

关于perl - 如何在 Perl 中为 Regex 访问数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4834921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com