Perl5와 Perl6 비교 Sigils 사용의 차이

Sigls (변수 이름의 시작 부분에 있는 기호) Perl 5와 Perl 6 사이의 차이를 볼 수 있습니다.
개요
Perl 5 및 Perl 6의 Sigils 개요를 시작합니다.
부호
Perl5
Perl6
@  
Array 
Positional
%  
Hash 
Associative

Subroutine 
Callable

Scalar
 Item

Typeglob
N/a
@(Array vs. Positional)
perl 5에서 그룹을 정의할 때 확장 가능한 표량 값 목록을 만들고sigil이 있는 이름을 지정할 수 있습니다. @:

# Perl 5
my @foo = (1,2,3);
push @foo, 42;
say for @foo; # 1␤2␤3␤42␤
perl 6에서 그룹을 정의할 때, 새 행렬 대상을 만들고 그것을 문법 패드의 이름으로 입력합니다.따라서

# Perl 6
my @foo = 1,2,3;
push @foo, 42;
.say for @foo; # 1␤2␤3␤42␤
기능상 Perl 5와 동일합니다.그러나 첫 번째 줄은 다음과 같습니다.

# Perl 6
my @foo := Array.new( 1,2,3 );
새 행렬 객체가 어휘에 정의된 이름을 가리키도록 바인딩됩니다.@foo.이, 이, 이, 그럼, 그 @perl 6의sigil은 하나의 유형 제약을 표시합니다. 이sigil로 어떤 물건을 lexpad 항목에 연결하려면 위치 역할을 수행해야 합니다.클래스가 SmartMatch를 사용하여 역할을 수행하는지 확인하는 것은 어렵지 않습니다.

# Perl 6
say Array ~~ Positional; # True
퍼블릭 6의 모든 배열은 퍼블릭 5에 연결된 배열로 이루어진다고 생각할 수 있습니다.그것도 사실에서 멀지 않다.만약 세부 사항을 깊이 파고들지 않는다면, 간단한 예가 이 점을 분명히 할 수 있을 것이다.이, 이, 이, 저, 저at-POS 방법은 위치 역할을 실현하는 것이다.단일 요소에 접근해야 할 때마다 이 방법을 사용합니다.그래서 네가 쓰면:say @a[42]실행 중:say @a.AT-POS(42)
물론 이것은 유일하게 실현할 수 있는 방법이 아니다.더.
위치 역할을 수행하기 위해 클래스를 연결해야 하는 것이 아니라 특수한 문법 사용이 특질입니다.그래서 쓸 필요가 없다.

# Perl 6
my @a := YourClass.new( 1,2,3 );
너는 다음과 같이 쓸 수 있다.

# Perl 6
my @a is YourClass = 1,2,3;
Perl 5에서는 바인딩 그룹이 일반 그룹보다 훨씬 느립니다.Perl 6에서도 배열이 시작될 때 느립니다.다행히도 rakudoperl6는 내연과 정시(Jiting)를 통해 열 코드 경로를 최적화합니다.조작 코드는 가능한 상황에서 기계 코드를 사용한다.(우화기의 발전으로 이런 상황은 더욱 빠르고 빈번하며 더욱 잘 발생한다.)
%(Hash vs. Associative)
Perl 6의 산열은 그룹과 유사합니다.또한 이를 바인딩 산열(Perl 5 용어 사용)으로 간주할 수도 있습니다.위치가 수조를 실현하는 역할에 사용되는 것이 아니라 결합성 역할은 산열을 실현하는 데 응용된다.
마찬가지로 간단한 예가 도움이 될 수 있다.관건적인 방법은 결합적인 역할을 실현하는 것이다.특정 키의 값에 접근해야 할 때마다 이 방법을 사용합니다.그래서 네가 쓰면:say %h<foo>
실행 중:say %h.AT-KEY("foo")물론, 네가 실현할 수 있는 많은 다른 방법이 있다.
&(Subroutine vs. Callable)
Perl 5에는 호출 가능한 실행 코드가 하나만 있습니다. 즉, 하위 프로그램:

# Perl 5
sub frobnicate { shift ** 2 }
그리고 하위 루틴을 매개 변수로 전달하려면 다음과 같은 참조가 필요합니다.

# Perl 5
sub do_stuff_with {
 my $lambda = shift;
 &$lambda(shift);
}
say do_stuff_with( \&frobnicate, 42 ); # 1764
Perl 6에서는 다양한 유형의 객체에 실행 가능한 코드가 포함될 수 있습니다.그들의 공통점은 그들이 되찾을 수 있는 배역을 소모했다는 것이다.
Sgil은% 신호와 결합성 캐릭터와@ 신호와 위치 캐릭터와 같이 상환 가능한 캐릭터에 강제로 귀속됩니다.Perl 5와 매우 가까운 예는 다음과 같습니다.

# Perl 6
my &foo = sub ($a,$b) { $a + $b }
say foo(42,666); # 708
변수가 & Sigil을 가지고 있어도 이 변수의 코드를 실행할 필요가 없다는 것을 주의하십시오.실제로 일반 사용자와 비교하기 시작하면 다음과 같은 차이가 없습니다.

# Perl 6
BEGIN my &foo = sub ($a,$b) { $a + $b } # same as sub foo()
Perl 5와 달리 Perl 6에서 시작 블록은 블록이 없는 단일 문장일 수 있기 때문에 외부와 그 문법 범위를 공유한다.그러나 우리는 앞으로의 문장에서 이 문제를 더욱 많이 토론할 것이다.
사용 & 변수는 컴파일할 때 실행 가능한 파일을 알고 있으며, 설령 어떤 것을 모른다 하더라도.
다음 작업을 수행하기 위해 코드 세그먼트를 설정할 수 있는 다른 방법도 있습니다.

# Perl 6
my &boo = -> $a, $b { $a + $b } # same, using a Block with a signature
my &goo = { $^a + $^b }   # same, using auto-generated signature
my &woo = * + *;     # same, using Whatever currying
피호출자가 그곳에서 무엇을 실행하기를 원하는지 표시하기 위해 서명 안에 서명할 수도 있다.이것은 우리로 하여금 이 절의 앞의 두 코드 예시로 돌아가게 한다.

# Perl 5
sub frobnicate { shift ** 2 }
sub do_stuff_with {
 my $lambda = shift;
 &$lambda(shift);
}
say do_stuff_with( \&frobnicate, 42 ); # 1764

# Perl 6
sub frobnicate { $^a ** 2 }
sub do-stuff-with(&lambda, $param) { lambda($param) }
say do-stuff-with( &frobnicate, 42 ); # 1764
Perl 6에서는 참조를 사용할 필요가 없습니다.코드 대상인 & 를 매개 변수로 간단하게 전달할 수 있습니다.
$(Scalar vs. Item)
@,% 및 & Sigils에 비해 $sigil은 좀 평범하다.형식 검사를 강제로 실행하지 않기 때문에 모든 형식의 대상에 연결할 수 있습니다.그래서 당신이 쓰면:

# Perl 6
my $answer = 42;
이런 일이 일어났다.

# Perl 6
my $answer := Scalar.new(42);
아주 낮은 수준을 제외하고는따라서 알고 싶으면 이 코드를 사용할 수 없습니다.네가 표량 변수를 성명할 때, 바로 이렇다.
Perl 6에서 $은(는) 모든 내용이 단일 항목으로 간주되어야 한다고 설명합니다.따라서 표량 용기에 배열 개체가 채워져 있어도 교체가 필요한 경우 단일 항목으로 간주됩니다.

# Perl 6
my @foo = 1,2,3;
my $bar = Array.new(1,2,3); # alternately: [1,2,3]
.say for @foo; # 1␤2␤3␤
.say for $bar; # [1 2 3]
다음 시나리오는 이전 시나리오의 경우 VS 3 교체에만 적용됩니다.접두사가 적당한sigil을 통해 어떤 내용을 교체할지 지시할 수 있습니다.

# Perl 6
.say for $@foo; # [1 2 3] , consider the array as an item
.say for @$bar; # 1␤2␤3␤ , consider the scalar as a list
하지만 아마도 이것은 우리를 소음이 너무 먼 곳으로 데려갈 것이다.다행히도 더 상세한 등가물이 있다.

# Perl 6
.say for @foo.item; # [1 2 3] , consider the array as an item
.say for $bar.list; # 1␤2␤3␤ , consider the scalar as a list
* (Typeglobs)
보시다시피 Perl 6에는 *sigil이나 type globs의 개념이 없습니다.만약 네가 어떤 유형의 구체인지 모른다면, 너는 이것을 걱정할 필요가 없다.Perl 5의 복잡한 기호 테이블을 알 필요 없이 고비를 잘 넘길 수 있습니다.
  • Perl 6에서 Sigil은 기호표에 저장된 이름의 일부분이고, Perl 5에서 이름은 신호가 없는 상황에서 저장된다.예를 들어 Perl 5에서 프로그램에서 $foo를 인용하면 컴파일러는 foo (sigil 없음) 를 찾은 다음 관련 정보를 가져옵니다. (이것은 그룹입니다.) 그리고 필요한 $sigil 인덱스를 찾습니다.Perl 6에서 $foo를 참조하면 컴파일러는 $foo를 찾아 해당 키와 관련된 정보를 직접 사용합니다
  • Perl 6의 매개 변수와 Perl 5의 Type Gulb SIGL을 나타내는 SLurpy를 혼동하지 마십시오. 서로 아무런 관계가 없습니다.
    Sigilless variables
    Perl 5는 기호 없는 변수를 지원하지 않습니다 (가능한 왼쪽 값 서브루틴을 제외하고는 매우 서투르다).
    Perl 6은 Sigilless 변수를 직접 지원하지는 않지만 접두사 백슬래시(\)를 통해 정의된 이름을 지원합니다.
    
    # Perl 6
    my \the-answer = 42;
    say the-answer; # 42
    지정된 값의 오른쪽이 상수이기 때문에 정의된 상수와 거의 같습니다.
    
    # Perl 5
    use constant the_answer => 42;
    say the_answer; # 42
    # Perl 6
    my constant the-answer = 42;
    say the-answer; # 42
    만약 정의의 오른쪽이 다른 것이라면 더욱 재미있을 것이다.용기 같아!이렇게 하면 다음 구문 기법을 사용하여 기호 없는 변수를 얻을 수 있습니다.
    
    # Perl 6
    my \foo = $ = 41;    # a sigilless scalar variable
    my \bar = @ = 1,2,3,4,5;   # a sigilless array
    my \baz = % = a => 42, b => 666; # a sigilless hash
    
    이것은 기본적으로 익명 어법 실체 (표량, 수조, 해시) 를 만들고 정상적인 의미로 초기화한 다음 생성된 대상 (표량 컨테이너 행렬 대상, 산열 대상) 의 이름을 귀속합니다. Perl 6의 다른 일반적인 변량으로 사용할 수 있습니다.
    
    # Perl 6
    say ++foo;  # 42
    say bar[2]; # 3
    bar[2] = 42;
    say bar[2]; # 42
    say baz<a b>; # (42 666)
    물론, 이렇게 하면 당신은 모든 장점을 잃게 될 것입니다. 특히 삽입값에 있어서는.그런 다음 삽입 값에서 을 사용해야 합니다.
    
    # Perl 6
    say "The answer is {the-answer}."; # The answer is 42.
    Perl 5의 대다수 버전에서는 해당 내용이 더 복잡합니다.
    
    # Perl 5
    say "The answer is @{[the_answer]}."; # The answer is 42.
    Perl 5 개념을 사용하여 이러한 변수를 고려할 때 Perl 6의 모든 변수는 귀속 변수로 간주됩니다.이것은 그들로 하여금 처음부터 좀 느리게 했다.그러나 일부 기준 테스트에서 실행 시 최적화 및 열 코드 경로의 JITting(점에서 기계 코드까지)은 Perl 5 변수를 초과하는 속도를 보였다.
    @,% 및 & Perl 6에서 특정한 대상을 만들지 말고 이름이 연결된 대상에 적용되는 형식의 제약을 표시합니다. $Sigil은 강제적으로 실행할 유형의 제약이 없기 때문에 이 방면에서 다르다.
    @ 및 $접두사는 사용하더라도 실제 값과 항목 값을 나타냅니다.명세서 및.프로젝트 방법 대체.
    몇 가지 문법 기법을 통해 변수 이름의 어떤 Sigl도 사용하지 않고 Perl 6를 프로그래밍할 수 있다.
    총결산
    이상은 이 글의 전체 내용입니다. 본고의 내용이 여러분의 학습이나 업무에 대해 일정한 참고 학습 가치를 가지기를 바랍니다. 여러분의 지지에 감사드립니다.더 많은 내용을 알고 싶으면 아래 링크를 보십시오

    좋은 웹페이지 즐겨찾기