2009-06-04 52 views
0

我今天早些时候问了一个关于using Perl to search in a CSS document的问题。自那以后,我对自己的要求进行了一些改进,并对自己想要做的事情有了更好的认识。如何使用Perl获取具有颜色或背景颜色属性的CSS元素列表?

我正在搜索的文档实际上是一个带有CSS的.html文档,作为<head>中的一种样式,如果有意义的话。

基本上,我需要做的是找到所有具有颜色或背景颜色属性的CSS元素,并记录它们。这是我的思考过程。

  1. 打开该文件,并将其设置为一个数组
  2. 阅读阵列行由行,直到它涉及到一个“{”
  3. 让一切变成一个标量或数组,直到我到达“}”
  4. 搜索次要变量或字符串的“颜色”等等等等等等等。

我遇到的问题是找到一种方法来冲刷文档,并将{和}之间的所有内容变为某种变量。有人有主意吗?

干杯!

回答

3

无论如何,我不建议从头开始编写自己的代码。你应该使用解析器。 CPAN上的快速搜索建议this family of modules。另一方面,如果你的CSS是在一个HTML文件而不是一个单独的CSS文件(对你不好意思),那么你可能最终需要一个不同类型的解析器。

无论哪种方式,尝试将自己的准分析器手动滚出正则表达式通常不是一个好主意。使用适当的解析器,并利用其他人的工作。

在略有不同的方面,如果您只想从任何类型的文件中提取某些信息,那么在很多情况下,您不希望先将整个文件放入数组中。 (如果文件非常大并且没有必要,这可能会占用大量内存)。在逐行处理文件时,很容易打开文件和处理项目。

#!/usr/bin/env perl 
use strict; 
use warnings; 

open my $fh, '<', 'file-of-interest' 
    or die "Couldn't open 'file-of-interest': $!"; 

my @saved_items; 

while (my $line = <$fh>) { 
    # process $line 
    # push @saved_items, $something 
} 

# Do more fun stuff with @saved_items 
+0

*大部分*案件有点强;只是偶尔会有一个足够大的文件,甚至会担心,并且在进行多行匹配时(如此处),将所有内容全部放在内存中要简单得多 – ysth 2009-06-05 01:39:40

1

您可以使用CPAN上提供的CSS模块。

1

我认为这实际上就是您之前询问过的同一个问题,虽然您没有提到您在之前的评论中曾提及您不认为您被允许使用模块。

CSS模块已经这样做。你可以看看源代码,看看它们是如何做到的。这也是我上次给你的同样的答案。

真的没有任何魔法或秘密的方式,每个人都躲在你身边。大多数情况下,如果您在CPAN上找到的模块可能会更简单,那将是。但是,如果没有更多的信息来限制您的问题,那么像SS](http://search.cpan.org/dist/CSS)这样的通用解决方案就是您的选择。研究该源代码或将其完全提升到您的脚本中,尽管您可以尝试一些参数来安装某些模块。如果您可以使用该模块,那么您可能已经完成并进入下一个项目。这通常是一个令人信服的论点。:)