Perl에서 변경하고 싶은 5가지(구문) 사항

10282 단어 perlsyntax
Brian D Foy의 What are five things you hate about your favorite language?과 다소 관련됨

내가 불편하다고 느끼는 몇 가지 Perl 구문이 있습니다.



이것은 나의 5가지 목록입니다! 😃

변형 인장



원본은 아니지만 불변의 인장이 나에게 의미가 있을 것입니다.

나는 컨텍스트나 슬라이스를 삭제하자고 주장하는 것이 아닙니다(전혀 아님). 그러나 불변 표지(컨테이너 유형이 무엇인지 간단히 보여줌)를 사용하면 기분이 더 나아질 것입니다.

(Raku이 이것을 하고 있습니다)

같은 종류의 일에서 $var@var가 다른 %var (등 ...)은 멋지지만 위험합니다.



배열 및 해시 선언


{}를 사용하여 해시(hashref가 아님)를 선언하고 []를 사용하여 array(arrayref가 아님)를 선언하는 것을 선호합니다.

이러한 기호는 우리가 요소에 액세스하는 데 사용하는 것과 동일하며, 나에게는 의미가 있습니다.

작업 펄 :

# Hash 
my %h = ( k1 => "1", k2 => "2" ); 
print $h{'k2'};

# Array
my @a = ( "a", "b" ); 
print $a[1];

# Hashref
my $h = { k1 => "1", k2 => "2" }; 
print $h->{'k2'};

# Arrayref
my $a = [ "a", "b" ]; 
print $a->[1];

{}는 해시 키에 액세스하기 위한 기호이고 []는 배열 인덱스에 액세스하기 위한 기호인데 왜 해시*ref* 및 배열*ref*에 연결되어 있습니까?

그리고 단순히 refs에 참조 연산자\를 재사용하는 것은 어떻습니까?

가상 코드 :

# Hash 
my %h = { k1 => "1", k2 => "2" }; # Same symbol to declare and access
print $h{'k2'}; 

# Array
my @a = [ "a", "b" ]; # Same symbol to declare and access
print $a[1]; 

# Hashref
my $h = \{ k1 => "1", k2 => "2" }; # \ is the "get ref" symbol
print $h->{'k2'}; 

# Arrayref
my $a = \[ "a", "b" ]; # \ is the "get ref" symbol
print $a->[1]; 


물론 배열/해시 변환, 배열 평면화 및 콤마와 같은 기능이 마음에 들지만 arrayref 및 hashref를 선언하는 방법이 약간 혼란스럽습니다.

누락된 쉼표



파일 핸들로 인쇄할 때 정당하지만 오류가 발생하기 쉬운 누락된 쉼표:

print $fh ARGS


기분이 좋지 않습니다./



핵심에서 더 나은 OO



좋아요 (1), 모듈을 설치하는 문제일 뿐입니다...

좋아요 (2), Cor 😃과 함께 옵니다



함수 프로토타입 또는 서명에 대해 여전히 명확하지 않음



함수 선언에 무엇을 사용해야 하는지 아직 확실하지 않습니다. 그것에 관한 몇 가지 리소스 :
  • Why are function prototypes bad
  • Perldoc prototypes
  • Perldoc signatures

  • 프로토타입이나 함수 서명이 필요합니다.

    나는 일반적으로 파일의 맨 위에 주석과 함께 모든 기능을 선언합니다.

    # Describe fn
    sub fn($$;$);
    


    명확성을 위해 그리고 매개변수를 확인하기 때문에 이 작업을 수행합니다( & 로 호출되지 않은 경우).
    또한 댓글로 모든 사전 선언을 수집하므로 인간을 위한 API를 제공합니다😄

    "사전 선언"도 필요할 수 있습니다(순서에 따라 그리고 괄호 없이 하위를 호출하는 경우). 하지만 이것이 주요 목표는 아닙니다(다시 & 로 우회할 수 있음).

    그런 다음 다음과 같이 기능을 정의합니다.

    sub fn($$;$) {
        my $name = shift;
        my $age = shift;
        my $optional_comment = shift;
    
        ...
    }
    


    내가 선호하는 것 :

    sub fn($$;$) {
        my ($name, $age, $optional_comment) = @_;
    
        ...
    }
    


    또는 더 나쁜 (😱) :

    sub fn($$,$) {
        print $_[0];
        print $_[1];
        print $_[2];
    
        ...
    }
    


    하지만 솔직히 잘 모르겠습니다. signatures는 실험적이라고 표시되어 있고 prototypes는 함수의 동작을 변경하기 때문에 사용해서는 안 됩니다.

    그렇다면 올바른 방법은 무엇입니까?

    결론



    그게 다야, 그게 내 목록이야! 😃



    당신은 무엇입니까?

    좋은 웹페이지 즐겨찾기