문제
어떤 방법을 사용하여 일정한 해시 키?
예를 들어:
use constant X => 1;
my %x = (X => 'X');
위의 코드는 해시를 만들과 함께"X"으로 핵심지 1 으로 핵심이다.반면,내가 원하는 값을 사용하여 일정한 X 으로 핵심이다.
해결책
use constant
실제로 일정한 서브 루틴.
무엇을 원할 필요가 명시적으로 호출 하위:
use constant X => 1;
my %x = ( &X => 'X');
나
use constant X => 1;
my %x = ( X() => 'X');
다른 팁
또 다른 옵션은 사용하지 사용이 일정한 pragma 플립을 읽기 전용으로 당 권장 사항에서는 Perl 최상의 방법으로 데미안 Conway.
저 전환 잠시 후 다시 깨닫는 일정한 해시 ref 의 일정을 참조하여 해시,하지만 아무것도하지 않는 데이터에 대한 내부 해시입니다.
Readonly 구문을 만듭니다"일반"변수이지만,실제로 적용하 constantness 또는 readonlyness.당신은 그것을 사용할 수 있는 것처럼 다른 변수로는 핵심입니다.
use Readonly;
Readonly my $CONSTANT => 'Some value';
$hash{$CONSTANT} = 1;
귀하의 문제는=>마법의 쉼표는 자동으로 따옴표는 단어 앞에습니다.그래서 당신이 쓴에 해당하('X','X').
가장 간단한 방법은 쉼표를 사용:
my %x = (X, 'X');
또는,추가할 수 있습니다 다양 한 문장 그래서 당신은 더 이상 간단한 단어 앞에는=>:
my %x = ( X() => 'X' );
my %x = ( &X => 'X' );
사 $hash{CONSTANT()}
나 $hash{+CONSTANT}
을 방지하 bareword 인용 메커니즘에서 발로습니다.
대부분의 다른 사람들은 당신의 질문에 대답니다.이와 함께,이러한 만들기를 매우 자세한 설명은 문제가 및 권고 해결 방법이 있습니다.문제는 Perl pragma"사용하여 일정한"정말로 만들어 서브루틴에서 현재 패키지는 누구의 이름은 첫 번째 인수의 pragma 고 값이 마지막입니다.
In Perl,한 서브루틴을 선언하고 있지 않고 괄호.
이해"상수"은 단순히 하루,당신은 이유를 볼 수 있습니다 그들은 보간에서 문자열 및 이유를"지방 쉼표로"운영자"=>"는 따옴표는 왼쪽 손을 인수를 생각하는 당신 손으로 그것이 문자열(도에 내장 된 다른 기능이 같은 시간()및 키()언젠가와 지방이에 쉼표를 위한 여분의 재미).
다행히도,당신을 호출할 수 있습니다 지속적인 사용하여 명시적인 구두점과 같은 괄호 또는 앰퍼샌드 인장.
그러나 나는 당신을 위한 질문:왜 당신은 당신을 사용하여 상수 위해 해시 키니까?
나는 생각할 수 있는 몇 가지 시나리오로 이어질 수도 있습니다 이 방향으로:
당신이 원하 제어하는 키에 해시입니다.
추상화하려는 이름의 열쇠는 경우에 이러한 변경 이후
의 경우에는 수 1,상수도 없이 저장이다.대신,고려 만들기 클래스가 있는 공 setter 및 getters 채우는 해시만 볼 수 있다.이것은 매우 유엔 Perl 같은 솔루션이지만,매우 쉽게 할 수 있다.
의 경우에 2 번,나는 여전히 강하게 옹호를 위해 클래스입니다.에 액세스하는 경우 해시는 규제를 통해 잘 정의된 인터페이스만을 구현한 클래스에 대한 책임을 얻고 해시 키 이름이 옳습니다.어떤 경우에,나는 않을 것이 좋을 사용하여 상수다.
희망이 도움이 시간 내주셔서 감사합니다.
이 use constant
pragma 만듭 서브루틴 프로토타입하수는 인수를 사용하지 않습니다.동 보 like a C-style 정,그것은 정말로 서브루틴을 반환하는 일정한 값입니다.
이 =>
(지방 쉼표)는 자동으로 따옴표는 왼쪽 피연산자가 bareword 고,$해시{key}표기 합니다.
는 방법으로 사용하는 경우의 일정한 이름처럼 보이는 bareword,인용 메커니즘이고 당신이 그것의 이름으로 대신 키의 값을 의미합니다.이를 방지하기 위해 변경을 사용하도록 아 bareword.예를 들어:
use constant X => 1;
%hash = (X() => 1);
%hash = (+X => 1);
$hash{X()} = 1;
$hash{+X} = 1;
이니셜라이저에서,당신도 사용할 수 있는 일반 쉼표하는 대신:
%hash = (X, 1);
=>운영자을 해석하는 그것의 왼쪽으로"문자열",방법 qw()는 않습니다.
을 사용하여 시험
my %x = ( X, 'X');
하나의 방법으로 캡슐화하 X(X):
my %x ( (X) => 1 );
또 다른 옵션은 멀리 할'=>'사용','대신:
my %x ( X, 1 );
코멘트@shelfoo(명성을 충분하지 않습니다 추가 코멘트이다.)
완전에 대해 동의 펄 최상의 방법으로 데미안 Conway...그 읽어보도록 적극적으로 권장합니다.
그러나 주시기 바랍 읽 뿐만 아니라 모듈을 추천한 해설 는 유용한"에라"을 사용할 계획인 경우 뿐만 아니라 위에서 스타일 가이드입니다.