如何在Perl for Regex中访问数组
我有两个输入读取到我的命令提示符,第一个是我正在编写的程序要搜索的一系列单词,第二个是包含要在其中找到单词的文件。例如,我的命令提示符读取perl WebScan.pl word WebPage000.htm 现在,我在访问这些输入进行打印时没有遇到任何问题,但是我很难访问网页的内容,因此我可以执行正则表达式来删除html标记并访问内容。我意识到有一个子程序可以在不使用正则表达式的情况下执行此操作,它的效率要高得多,但我需要使用正则表达式:( 我可以轻松访问html文件进行打印:如何在Perl for Regex中访问数组,perl,Perl,我有两个输入读取到我的命令提示符,第一个是我正在编写的程序要搜索的一系列单词,第二个是包含要在其中找到单词的文件。例如,我的命令提示符读取perl WebScan.pl word WebPage000.htm 现在,我在访问这些输入进行打印时没有遇到任何问题,但是我很难访问网页的内容,因此我可以执行正则表达式来删除html标记并访问内容。我意识到有一个子程序可以在不使用正则表达式的情况下执行此操作,它的效率要高得多,但我需要使用正则表达式:( 我可以轻松访问html文件进行打印: open (D
open (DATA, $ARGV[1]);
my @file = <DATA>;
print @file;
open(数据,$ARGV[1]);
my@file=;
打印@文件;
它打印html页面的整个代码,但我无法传递正则表达式以删除html块。我一直收到一个错误,该错误表示“无法修改s///near中的数组解引用,”这就是我的特定正则表达式所在的位置。我不知道如何解决这个问题-我已经尝试将数组转换为标量,但是我根本无法访问html中的任何数据(不,它不只是打印数组中的值:P)
如何访问数组的内容,以便使用正则表达式优化所需的输出?听起来像是在执行类似于
@file=~s/find/replace/;
的操作。之所以会出现此错误,是因为正则表达式绑定运算符的左侧对其参数施加了标量上下文URN的长度,但此值为只读。因此,当替换尝试执行替换时,kaboom
为了处理文件的所有行,可以使用foreach
循环:
foreach my $line (@file) {$line =~ s/find/replace/}
或者更简洁地说:
s/find/replace/ for @file;
但是,如果在HTML文件上运行正则表达式,很可能需要它们跨多行进行匹配。上面所做的是在中读取整个文件,并将每行存储为@file
的一个元素。如果在数组上使用Perl的迭代控制结构之一,则无法匹配mul多行。因此您应该将文件读入单个标量。然后您可以按预期使用$file=~s//
您可以通过临时清除输入记录分隔符$/
,将文件转换为单个变量:
my $file = do {local $/; <DATA>};
我们需要查看正则表达式代码。@codaddict=>您从类似
perl-e'@array=~s///'
的地方得到这个错误,因为标量上下文中的数组返回的值是只读的,所以perl退出了。不要将数据用作文件句柄名,它是一个特殊的文件句柄。实际上,不要使用全局文件句柄,而是使用词法文件句柄。使用e 3参数形式的open
来制作它们。打开我的$fh,'太棒了,非常感谢。是的,这是一个家庭作业问题,但不幸的是,教授和助教都没有解释如何访问html文件。作为slurp的替代方案(特别是如果您需要先下载该页面,但也适用于本地页面),您可以使用LWP::UserAgent,使用LWP::UserAgent;my$ua=LWP::UserAgent->new();my$html=$ua->get($address)->as_string();
现在您有了标量$html中名为$address的站点的html源代码。
open my $DATA, '<', $ARGV[1] or die "open error: $!";
my $file = do {local $/; <$DATA>};