4 관련 없는 펄 정보

5770 단어 perl
저는 최근에 Perl 커뮤니티에서 "The Camel Book"으로 자주 언급되는 Programming Perl 의 사본을 구입했습니다. 처음 4개의 챕터를 읽은 후 흥미로운 Perl 정보 몇 개를 공유해야겠다고 생각했습니다.

<>가 True인 동안


logos.txt라는 파일이 있다고 가정해 보겠습니다.

Onion
Camel

Raptor

그리고 같은 디렉토리에 scratch.pl라는 프로그램이 있습니다.

open my $fh, '<', 'logos.txt' or die;
while (my $logo = <$fh>) {
    print $logo;
}
close $fh;


예상대로 프로그램은 logos.txt 의 내용을 인쇄합니다.

$ perl ./scratch.pl
Onion
Camel

Raptor

내가 정말로 고려하지 않은 것은 <>logos.txt에서 빈 줄을 읽을 때 루프가 종료되지 않는 이유는 무엇입니까? <> 거짓 값인 빈 문자열을 반환하면 안 됩니까?

Programming Perl에 따르면 루프가 종료되지 않는 이유는 <>가 줄 끝에서 줄 바꿈을 읽어서 실제로 참 값인 "\n"를 얻기 때문입니다. 이것은 fib이며 실제 이유는 while (my $logo = <$fh>) ...while (defined (my $logo = <$fh>)) ...로 확장되고 "\n"가 정의된 값이기 때문입니다.

B::Deparse 으로 코드를 분석하여 이를 확인할 수 있습니다.

$ perl -MO=Deparse,-p,-sCi2 -ne 42
LINE: while (defined(($_ = readline(ARGV)))) {
  '???';
}
-e syntax OK


Heredocs는 셸 명령을 실행할 수 있습니다.



대부분의 Perl 프로그래머는 heredocs 종료 문자열을 작은따옴표로 묶으면 변수 보간을 방지한다는 것을 알고 있습니다.

my $var = 12;
print <<'EOS';
Hello
$var = 12
EOS


프로그램 출력에서 ​​$var가 보간되지 않은 것을 볼 수 있습니다.

$ perl ./scratch.pl
Hello
$var = 12

그러나 종료 문자열을 역따옴표로 묶으면 각 줄이 쉘 명령으로 실행된다는 사실을 알고 계셨습니까?

print <<`EOC`;
echo this is a shell command
echo this is also a shell command
EOC


이 프로그램을 실행하면 echo 명령이 실행되었음을 알 수 있습니다.

$ perl ./scratch.pl
this is a shell command
this is also a shell command

쉼표 연산자



나는 항상 쉼표를 당연하게 여겼고 그것이 실제로 연산자라는 것을 결코 깨닫지 못했습니다.

스칼라 컨텍스트에서 평가할 때 목록이 마지막 요소를 반환하는 이유가 궁금한 적이 있습니까? 쉼표 연산자 때문인 것으로 나타났습니다.

스칼라 컨텍스트에서 쉼표 연산자 ","는 첫 번째 인수를 무시하고 스칼라 컨텍스트에서 평가된 두 번째 요소를 반환합니다.

이는 스칼라 컨텍스트에서 목록(11, 22, 33)이 33으로 평가됨을 의미합니다. 첫 번째 쉼표 연산자는 11을 버리고 스칼라 컨텍스트에서 평가된 (22, 33)를 반환합니다. 이 값은 22를 버리고 33을 반환하여 평가됩니다.

자동 증가 문자열



Perl에서는 숫자뿐만 아니라 문자열도 자동 증가할 수 있습니다. 문자열을 증가시키려면 정규식/^[a-zA-Z]*[0-9]*\z/과 일치해야 합니다.

단일 알파벳 문자열은 직관적으로 증가합니다.

$ perl -E 'my $v = "a"; say ++$v'
b
$ perl -E 'my $v = "B"; say ++$v'
C

영숫자가 아닌 문자를 증가시키면 어떻게 됩니까? 다음 ASCII 문자를 제공합니까? 증가할 때 영숫자가 아닌 문자는 0으로 처리됩니다. 다행스럽게도 warnings을 사용하면 Perl이 알려줄 것입니다.

$ perl -W -E 'my $v = "-"; say ++$v'
Argument "-" treated as 0 in increment (++) at -e line 1.
1

알파벳의 끝에 있는 z 를 증가시키면 어떻게 될까요? a로 다시 돌아갑니까? 이것은 일이 흥미로워지는 곳입니다. Perl은 일반 숫자 시스템에서처럼 문자열을 증가시킵니다. stringimal의 십진수9 + 1 = 10z + 1 = aa와 같습니다.

$ perl -E 'my $v = "z"; say ++$v'
aa

다음은 문자열 자동 증가의 마법을 보여주는 몇 가지 예입니다.

$ perl -W -E 'my $v1 = "foo"; say ++$v1'
fop
$ perl -W -E 'my $v1 = "az"; say ++$v1'
ba
$ perl -W -E 'my $v1 = "a9"; say ++$v1'
b0

좋은 웹페이지 즐겨찾기