2009-06-04 53 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)這樣的通用解決方案就是您的選擇。研究該源代碼或將其完全提升到您的腳本中,儘管您可以嘗試一些參數來安裝某些模塊。如果您可以使用該模塊,那麼您可能已經完成並進入下一個項目。這通常是一個令人信服的論點。:)