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

データベース.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はグローバル$/であるため使用できません。囲んでいるブロックに対してのみ存在する字句値を宣言します。どこからでもアクセス可能なグローバル値に一時的な (ローカル) 値を割り当てるために使用されます。mylocal

  3. それらが持っている効果は、変数の値をその時点の文字列に補間すること$oです$DO。間違いのようです:DOは明らかにテキストの一部です。オリジネーター$o名前である可能性が最も高く、埋め込まれた改行であり、2番目は偽です。\n$

    このコードには何もないuse strictか、適切に配置されていると思います。出力は次のようになります。use warnings誰も行方不明に気づいていませんDO!

 

# host file = GENERATED BY originator
 NOT EDIT BY HAND!
#
于 2013-06-19T17:54:19.930 に答える
5

レキシカル変数 (Perl 以外ではローカル変数とも呼ばれます) を宣言myします。

でグローバル変数を宣言できます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 に答える