2013-06-19 65 views
2

record.txt「我」 與 「本地」 和使用大括號

name: shimmer 
addr: 192.168.1.11 
owner: David Davis 
building: main 
-=- 
name: bendir 
addr: 192.168.1.3 
owner: cindy Coltrane 
building: west 
-=- 
name: sulawesi 
addr: 192.168.1.12 
owner: Ellen Monk 
building: main 
-=- 
name: sander 
addr: 192.168.1.55 
owner: Alex rollins 
building: east 

database.pl

my $datafile = 'record.txt'; 
my $recordsep = "-=-\n"; 


open my $DATAFILE, '<', "$datafile" or die "unable to open datafile:$!\n"; 

{ 
    local $/= $recordsep;  #prepare to read in database file one record at a time 
    print "#\n# host file = GENERATED BY $o\n$ DO NOT EDIT BY HAND!\n#\n"; 


    my %record; 
    while(<$DATAFILE>) { 
     chomp;  #remove the record separator 

     #split into key1,value1, ....bingo, hash of record 
     %record = split /:\s*|\n/; 
     print "$record{addr}\t$record{name} $record{building} \n"; 
    } 
    close $DATAFILE; 
} 

的我對這個Perl代碼的一些問題。

  1. 請問open之後的大括號{ }有什麼意義?
  2. 做什麼要點local $/= $recordsep;local vs my
  3. 什麼是訂單

    print "#\n# host file = GENERATED BY $o\n$ DO NOT EDIT BY HAND!\n#\n"; 
    
+0

注意:將'local'放在curlies而不是'open'中是沒有意義的。 – ikegami

回答

6
  1. $o\n$意義大括號界定範圍,其中的$/local值生效。在大括號之外,變量保持其原始值。沒有它們,$/會保留新的值直到文件的末尾。

  2. 不能使用在$/my,因爲它是一個全球性價值my聲明瞭只對封閉塊存在的詞法值。 local用於將臨時(本地)值分配給仍然可以訪問的全局值。

  3. 這些影響是將變量$o$DO的值內插到字符串的那一點。它看起來像一個錯誤:DO顯然是文本的一部分。 $o最有可能是 riginator的名稱,\n是嵌入式換行符,第二個$是虛假的。

    我想這個代碼沒有use strictuse warnings,輸出看起來像這樣。沒有人注意到失蹤的DO

 

# host file = GENERATED BY originator 
NOT EDIT BY HAND! 
# 
+0

事實上,'$ DO'很可能是'#DO'的錯字。 – darch

+0

@darch:當然可以。這是heredoc的情況! – Borodin

+0

Whitespace ...之後... sigil ...傷害...大腦。 +1 – pilcrow

5

my聲明一個詞法變量(也稱爲局部變量的Perl的外部)。

您可以用our聲明全局變量。

local不聲明變量,而是備份全局變量。也就是說

our $var = 1; 

{ 
    local $var = 42; 
    say $var; 
} 

say $var; 

輸出

42 
1 

在離開塊,的$var舊值被恢復。這不適用於詞法(my)變量,您可以直接聲明另一個同名的詞法變量。

標點符號變量都是全局變量。例如,$/輸入記錄分隔符,如perlvar中所記錄。 readline操作將讀取直到EOF,或直到讀取了值$/之後。此外,chomp將從行尾移除此字符串。

只有在嚴格定義的範圍內修改這些特殊變量才被認爲是很好的風格,因此該塊。