2

记录.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

数据库.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;localmy
  3. $o\n$行中的意思是什么

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

2 回答 2

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!
#
于 2013-06-19T17:54:19.930 回答
5

my声明了一个词法变量(在Perl 之外也称为局部变量)。

您可以使用our.

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

our $var = 1;

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

say $var;

输出

42
1

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

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

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

于 2013-06-19T17:54:42.617 回答