2012-08-25 37 views
1

我有以下幾點:Perl的傳遞常量子程序

#! /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); 

看來,我的常量爲裸詞和隱性引號可可西里路徑的聲明中補充治療。有沒有一種簡單的方法來定義這樣一個映射,其中符號鍵可以在函數調用中使用?

回答

2

=>運營商做了兩兩件事:

  1. 報價左側
  2. 行爲的裸詞如逗號

如果你只想要2號,只使用一個逗號。

+0

當然!有時候,你會習慣於某種做事方式,忘記了自己的所作所爲。用{x => y}以外的任何東西初始化散列看起來是錯誤的,即使它是正確的。 –

+0

我知道你的意思。感覺很好,可以想象perl具有專門用於編譯時構建散列文字的語法(其中'=>'是鍵/值分隔符,並且逗號僅用於對之間),但這只是一種幻覺。 –

+0

知道你的祕密操作員:[閃爍的胖逗號',=>'](https://github.com/book/perlsecret/blob/master/lib/perlsecret.pod#winking-fat-comma-)禁用裸字引用。 – daxim

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";