WTF는 "0이지만 사실"



저는 제 인생의 대부분을 JavaScript로 코딩하는 데 보냈습니다. 저에게는 사용이 자연스럽고 대부분의 기이함과 기이함을 마음으로 알고 있습니다. 이들 중 많은 부분이 신규 이민자에게는 매우 이상하며 할 수 있음을 이해합니다generate some aversion . 그러나 최근 JavaScript의 기이함을 아마추어처럼 보이게 만드는 Perl의 이러한 것들 중 하나에 대해 배웠습니다.

펄? 저게 뭐에요?



Perl은 스크립팅 프로그래밍 언어로 90년대 초반에 꽤 인기가 있었고 최근에는 사용률이 떨어졌지만 작성 시점에는 여전히 TIOBE index 에서 상위 20위 안에 들었습니다. 그것은 many others 중에서 git 또는 Linux 커널과 같은 생물 정보학, 시스템 운영 및 프로젝트에서 여전히 널리 사용됩니다. Perl은 종종 비밀스러운 구문과 강력한 한 줄짜리 및 정규식이지만 간결함으로 잘 알려져 있습니다. 이것은 또한 유지 관리가 어렵다는 비난을 받았기 때문에 저주입니다“write-only”.

Perl은 Python, JavaScript 또는 PHP와 같은 언어와 많은 유사점을 공유합니다. 그 변수는 다른 유형을 가질 수 있으며, 각각은 변수 이름 앞에 PHP와 유사한 다른 sigil을 붙입니다: $scalar 및 @array 또는 %hash일 수 있는 목록.

펄 이해하기



스칼라는 문자열, 숫자, 실수 또는 목록에 대한 참조일 수 있는 단일 값을 나타냅니다. 우리는 이것에 대해 깊이 들어가지는 않겠지만 중요한 아이디어는 Perl이 다른 스크립팅 언어처럼 필요에 따라 이러한 다른 값 사이를 변환한다는 것입니다. 그러나 이것은 때때로 명시적이지 않으며 잘못된 유형에 잘못된 연산자를 사용하면 불평할 것입니다.

0> my $aString = "string"
$res[1] = "string"
1> $aString == "string" ? "true" : "false";
Argument "string" isn't numeric in numeric eq (==) at reply input line 1.
Argument "string" isn't numeric in numeric eq (==) at reply input line 1.
$res[2] = "true"
3> $aString eq "string" ? "true" : "false";
$res[3] = "true"


위의 예에서 문자열 연산자 대신 숫자 연산자를 사용했기 때문에 Perl이 불평하는 것을 볼 수 있습니다. 일반적으로 경고 없이 엄격 모드에서 스크립트를 실행하면 오류가 발생하고 실행이 중지됩니다.

Perl에는 부울 유형이 없지만 다른 값은 "참"또는 "거짓"으로 평가됩니다. 공무원 인용 documentation :

The number 0, the strings ‘0’ and “”, the empty list (), and undef are all false in a boolean context. All other values are true. Negation of a true value by ! or not returns a special false value. When evaluated as a string it is treated as “”, but as a number, it is treated as 0.



"0 but true"의 특별한 점



"0이지만 참":
  • 끈이다...
  • 0으로 사용할 수 있는
  • 그러나 true로 평가됩니다.

  • 따라서 우리는 다른 문자열과 같이 작동할 수 있습니다.

    0> my $zeroButTrue = "0 but true";
    $res[1] = "0 but true"
    1> split " ", $zeroButTrue;
    $res[2] = (0, "but", "true")
    


    그러나 우리는 또한 약간의 수학을 할 수 있습니다!! 엄격 모드와 경고가 활성화된 경우 다른 문자열에서는 작동하지 않습니다.

    2> 10 + $zeroButTrue;
    $res[3] = 10
    3> my $oneString = "1 string";
    $res[4] = "1 string"
    4> 10 + $oneString;
    Argument "1 string" isn't numeric in addition (+) at reply input line 1.
    $res[5] = 11
    


    그러나 이것이 0이 작동하는 방식이 아니라는 것도 알 수 있습니다.

    5> $zeroButTrue ? "true" : "false";
    $res[6] = "true"
    6> 0 ? "true" : "false";
    $res[7] = "false"
    


    하지만 왜?



    이 이상한 동작의 원인은 *nix 시스템이 프로세스 반환을 처리하는 방식 때문입니다. 이러한 시스템에서 프로세스가 0을 반환하면 성공 또는 참을 의미하며 Perl 또는 거의 모든 다른 프로그래밍 언어와 반대입니다. 0이 아닌 다른 숫자는 오류이며 오류 코드의 출력 값입니다. 처리하지 않고 이 값을 취하면 출력이 생성됩니다. 따라서 0을 반환하는 대신 0이지만 true를 반환하고 오류인 경우 오류 코드를 값으로 반환합니다. 오류 코드는 여전히 숫자로 평가되므로 true로 평가됩니다.

    이 마법의 문자열은 참으로 신기한 것인데, 이는 평가할 때(또는 if 대신에 if 대신 사용하여) 단순히 반환 결과를 반전시켜 오류를 거짓으로 평가함으로써 해결할 수 있습니다. 내가 알지 못하는 이 선택에 대한 다른 디자인 결정이 있을 수 있지만 동시에 초보자를 우연히 해치지 않고 항상 놀라게 하는 것은 재미있는 기이함입니다.

    참조


  • perlsyn
  • ioctl
  • 좋은 웹페이지 즐겨찾기