2014-01-23 18 views
2

我正在學習Perl。在閱讀Perl中的「config」文件時需要說明

我在文件中看到了一個使用函數「do」的腳本。然後我讀了關於該功能:

如果做可以讀取該文件,但不能編譯它,它返回undef和 設置在$ @錯誤消息。如果不能讀取文件,則返回 undef並設置$!到錯誤。總是首先檢查$ @,因爲編譯 可能會以設置$!的方式失敗。 。如果文件編譯成功 ,則返回最後一個表達式的值。

如果出現問題,包含庫模塊可以更好地完成使用,並且需要運算符 ,該運算符還會自動進行錯誤檢查並引發異常。

您可能喜歡用do來讀取程序配置文件。 手動錯誤檢查可以通過以下方式完成: 您可能希望使用do來讀取程序配置文件。 手冊錯誤檢查可以做到這樣:

# read in config files: system first, then user 
for $file ("/share/prog/defaults.rc", 
      "$ENV{HOME}/.someprogrc")  { 
    unless ($return = do $file) { 
     warn "couldn't parse $file: [email protected]" if [email protected]; 
     warn "couldn't do $file: $!" unless defined $return; 
     warn "couldn't run $file"  unless $return; 
    } 
} 

爲什麼他們都在談論編譯一個配置文件,我不明白? 它是什麼樣的配置文件?爲什麼/何時使用該配置文件?

謝謝

+0

感謝您的回答。現在我明白了 – user1117862

回答

8

有時,使用腳本代替配置文件。這可以設置全局狀態,或返回一些值。例如:

myprogrc

{ 
    foo => "bar", 
    baz => 42, 
} 

用法:

my $file = "myprogrc"; 
if (my $config = do $file) { 
    # do something with the config values 
    print "config values were $config->{foo} and $config->{baz}\n"; 
} 
else { 
    warn "couldn't parse $file: [email protected]" if [email protected]; 
    warn "couldn't do $file: $!" unless defined $config; 
    warn "couldn't run $file"  unless $config; 
} 

不要這樣做。因爲配置文件只是Perl代碼,它可以執行任意的東西 - 危險的!例如。一個`rm -rf ~`將是一個令人討厭的驚喜。

有很多更好的配置格式:

,如果它真的必須是,你可以使用JSON或XML。所有這些格式的優點是,它們只是數據而不是代碼。因此它們可以安全使用(假設解析器沒有錯誤)。