"我的"vs"本地"和使用大括号

eal*_*eon 2 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
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

我对这个perl代码有几个问题.

  1. 在行{ }之后将代码放在括号中有open什么意义?
  2. 这样做有什么意义local $/= $recordsep;localvs my
  3. 什么意思$o\n$在线路

    print "#\n# host file = GENERATED BY $o\n$ DO NOT EDIT BY HAND!\n#\n";
    
    Run Code Online (Sandbox Code Playgroud)

Bor*_*din 6

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

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

  3. 那些被具有的效果是内插的变量的值$o,并$DO进入在该点的字符串.这看起来像是一个错误:DO显然是文本的一部分.它最有可能$oo riginator 的名称,\n是嵌入式换行符,第二个$是虚假的.

    我想这个代码没有use strict或没有use warnings,输出看起来像这样.没有人注意到失踪DO!

 

# host file = GENERATED BY originator
 NOT EDIT BY HAND!
#
Run Code Online (Sandbox Code Playgroud)


amo*_*mon 5

my声明一个词法变量(也称为局部变量的Perl的外部).

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

local没有声明一个变量,而是备份一个全局变量.那是

our $var = 1;

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

say $var;
Run Code Online (Sandbox Code Playgroud)

输出

42
1
Run Code Online (Sandbox Code Playgroud)

离开块时,将$var恢复旧值.这不适用于lexical(my)变量,您可以只声明另一个同名的词法变量.

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

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