1

私は次のものを持っています:

#! /usr/bin/perl

use strict;

# Declare some meaningful named constants
use constant {FOO => 2,
              BAR => 3,
              BAM => 4};

# Define paths between the named entities
my %PATHS = (FOO => {BAR => "Foo->Bar",
                     BAM => "Foo->Bam"},
             BAR => {FOO => "Bar->Foo",
                     BAM => "Bar->Bam"},
             BAM => {FOO => "Bam->Foo",
                     BAR => "Bam->Bar"});

# Printing out PATHS map does more or less what I expect:
foreach my $src (sort keys %PATHS) {
  foreach my $dst (sort keys %{ $PATHS{$src} } ) {
    print "$src:$dst\t$PATHS{$src}{$dst}\n";
  }
}

# I can't use the constants as parameters
sub findPath($$) {
  my $src = shift;
  my $dst = shift;

  print "src:$src\ndst:$dst\n";
  my $path = $PATHS{$src}{$dst};
  print defined $path ? "path=$path\n" : "UNDEFINED\n";
}

findPath(FOO, BAR);

私の定数はベアワードとして扱われ、暗黙の引用符が HoH PATHS の宣言内に追加されているようです。関数呼び出し全体でシンボリック キーを使用できるようなマップを定義する簡単な方法はありますか?

4

2 に答える 2

2

=>オペレーターは次の 2 つのことを行います。

  1. 左のベアワードを引用します
  2. コンマのように振る舞う

#2 だけが必要な場合は、コンマを使用してください。

于 2012-08-25T22:45:07.890 に答える
0

Perl定数は、実際にはパラメーターを受け取らず、固定値を返す単なるサブルーチンです。

つまり、&プレフィックスを追加して、強制的に補間することができます。

my %PATHS = (&FOO => {&BAR => "Foo->Bar",
                      &BAM => "Foo->Bam"},
             &BAR => {&FOO => "Bar->Foo",
                      &BAM => "Bar->Bam"},
             &BAM => {&FOO => "Bam->Foo",
                      &BAR => "Bam->Bar"});

=>そして、キー=>値の関係を示す優れた構文を維持します。

常に機能する古い@{[...]}トリックを使用することもできます。

print "The value of constant FOO is '@{[FOO]}'\n";

これよりも目で解析する方が簡単です。

print "The value of constant FOO is '" . FOO . "'\n";
于 2012-08-26T03:21:39.477 に答える