Perl의 명명된 서브루틴 인수

11431 단어 perl
서브루틴 인수의 이름을 지정하면 코드의 가독성이 높아집니다. 명명된 인수의 이점을 얻을 수 있는 코드의 예를 살펴보겠습니다.

sub safe_open {

    my $file = shift @_;
    my $mode = shift @_;
    my $die_on_failure = shift @_;

    my $success = open(my $fh, $mode, $file);

    if ((not $success) and $die_on_failure) {
        die "error: failed to open '$file': $!\n";
    }

    return $fh;
}


다음 예제에서 세 번째 인수를 사용하면 파일을 열 수 없는 경우 프로그램을 종료해야 하는지 여부를 제어할 수 있습니다.

my $fh = safe_open('/file/that/doesnt/exist', '>', 1);
print $fh "Hello, World!\n";

# OUTPUT:
# error: failed to open '/file/that/doesnt/exist': No such file or directory



my $fh = safe_open('/file/that/doesnt/exist', '>', 0);
print $fh "Hello, World!\n";

# OUTPUT:
# print() on closed filehandle $fh at ./scratch.pl line 22.


이전에 이 코드로 작업한 적이 없는 사람이 &safe_open에 대한 이러한 호출을 발견했다고 상상해 보십시오. 서브루틴의 실제 코드를 살펴보지 않으면 세 번째 인수가 무엇을 의미하는지 알 수 없습니다.

사람들이 인수의 의미를 더 쉽게 이해할 수 있도록 이름을 지정할 수 있습니다!

sub safe_open {

    my %args = (
        FILE => '',
        MODE => '',
        DIE_ON_FAILURE => 1,
        @_
    );

    $args{FILE} or die "error: missing FILE arg in call to &safe_open\n";
    $args{MODE} or die "error: missing MODE arg in call to &safe_open\n";

    my $success = open(my $fh, $args{MODE}, $args{FILE});

    if ((not $success) and $args{DIE_ON_FAILURE}) {
        die "error: failed to open '$args{FILE}': $!\n";
    }

    return $fh;
}


이 서브루틴을 호출하는 몇 가지 예를 살펴보겠습니다.

my $fh = safe_open(FILE => '/file/that/doesnt/exist', MODE => '>', DIE_ON_FAILURE => 1);
print $fh "Hello, World!\n";

# OUTPUT:
# error: failed to open '/file/that/doesnt/exist': No such file or directory



my $fh = safe_open(FILE => '/file/that/doesnt/exist', MODE => '>');
print $fh "Hello, World!\n";

# OUTPUT:
# error: failed to open '/file/that/doesnt/exist': No such file or directory



my $fh = safe_open(DIE_ON_FAILURE => 0, FILE => '/file/that/doesnt/exist', MODE => '>');
print $fh "Hello, World!\n";

# OUTPUT:
# print() on closed filehandle $fh at ./scratch.pl line 25.


이러한 예에서 주목해야 할 몇 가지 사항이 있습니다.
  • 인수는 ARG => value 구문을 사용하여 명시적으로 이름을 지정해야 합니다.
  • 인수 순서는 중요하지 않습니다.
  • DIE_ON_FAILURE 인수는 선택 사항이며 기본값은 true입니다.

  • 우리의 &safe_open 서브루틴은 %args 해시를 구성하는 데 사용되는 전략 때문에 이러한 기능을 가지고 있습니다.

    인수 순서가 중요하지 않은 이유는 해시가 정렬되지 않았고 결국 인수 목록에서 해시를 구성하기 때문입니다.

    짝수의 요소가 있는 한 배열을 사용하여 해시를 구성할 수 있습니다. 이를 활용하여 @_ 배열을 사용하여 %args 해시를 구성합니다. 다음은 이 동작의 예입니다.

    my @array = ('foo', 12, 'bar', 13);
    
    my %hash = @array;
    
    print "\$hash{'foo'} = $hash{'foo'}\n";
    print "\$hash{'bar'} = $hash{'bar'}\n";
    
    # OUTPUT:
    # $hash{'foo'} = 12
    # $hash{'bar'} = 13
    


    해시 정의가 동일한 키를 여러 번 정의하는 경우 마지막 정의가 사용된다는 사실 때문에 기본 인수 값을 제공할 수 있습니다. 사용자가 인수를 생략하면 재정의되지 않고 기본값으로 설정된 상태로 유지됩니다. 다음 예를 고려하십시오.

    my %hash = (
        FOO => 12,
        FOO => 13
    );
    
    print "\$hash{'FOO'} = $hash{'FOO'}\n";
    
    # OUTPUT:
    # $hash{'FOO'} = 13
    


    개요



    서브루틴 인수 배열( @_ )을 사용하여 해시를 구성할 수 있으며, 이는 코드 가독성 측면에서 상당한 이점을 제공할 수 있습니다. 인수 배열에서 해시를 생성함으로써 서브루틴에 대한 모든 호출은 인수의 이름을 명시적으로 지정해야 합니다. 인수 순서는 관련이 없으며 인수에 기본값을 지정할 수 있습니다.

    좋은 웹페이지 즐겨찾기