2011-01-29 80 views
3

我有两个输入读入到我的命令提示符中,第一个是一系列要由正在编写的程序搜索的单词,第二个是包含在哪里找到单词。所以,举例来说,我的命令提示符下读取的perl WebScan.pl字WebPage000.htm如何在Perl中访问正则表达式阵列

现在,我有麻烦访问任一输入,用于印刷,但我有访问的网页,所以我可以将内容好容易执行正则表达式来删除html标签并访问内容。我知道有一个子程序可以做到这一点没有正则表达式,这是更有效的,但我需要用正则表达式:(

我可以访问html文件打印没有麻烦:

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

打印整个html页面的代码,但我无法通过正则表达式来删除html块。我一直收到一个错误,说:“不能修改s ///附近的数组解除引用,“这是我有我的具体正则表达式。我不知道如何解决这个问题 - 我试图将数组转换为标量,但然后我无法访问HTML中的任何数据(不,它不只是打印e数组中的数值:P)

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

+0

我们需要看到正则表达式的代码。 – codaddict 2011-01-29 03:34:00

+0

@codaddict =>你从`perl -e'@array =〜s /这样的东西得到这个错误。//'`由于数组在标量上下文中返回的值是只读的,因此perl保留。 – 2011-01-29 03:48:05

回答

14

这听起来像你正在做的事情,如@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>};