“我的”vs“本地”和使用大括号

时间:2013-06-19 17:46:53

标签: perl scope

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. 行中$o\n$的含义是什么

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

2 个答案:

答案 0 :(得分:6)

  1. 大括号定义local $/值生效的范围。在大括号外,变量保持其原始值。没有它们$/会将新值保留到文件末尾。

  2. 您无法在my上使用$/,因为它是全局值。 my声明一个仅存在于封闭块的词法值。 local用于将临时(本地)值分配给仍可在任何位置访问的全局值。

  3. 所产生的效果是将变量$o$DO的值插入到该点的字符串中。这看起来像是一个错误:DO显然是文本的一部分。最有可能的是$o o 操纵者的名称,\n是嵌入式换行符,第二个$是假的。

    我想这个代码上没有use strictuse warnings,输出看起来像这样。没有人注意到遗失的DO

  4. # host file = GENERATED BY originator
     NOT EDIT BY HAND!
    #
    

答案 1 :(得分:5)

my声明词汇变量(也称为Perl之外的局部变量)。

您可以使用our声明全局变量。

local不声明变量,而是备份全局变量。那是

our $var = 1;

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

say $var;

输出

42
1

离开该区块后,将恢复$var的旧值。这不适用于词法(my)变量,你只需要声明另一个同名的词法变量。

标点符号变量都是全局变量。 $/例如是输入记录分隔符,如perlvar中所述。读取操作将一直读到EOF,或直到读取$/值之后。此外,chomp将从该行的末尾删除此字符串。

仅在严格定义的范围内修改这些特殊变量被认为是好的风格,因此就是块。