[perl] 펄의 숨겨진 기능?

실제로 유용한 작업을 수행하기 위해 실제로 사용할 수 있었지만 Perl에서 실제로 유용하지만 난해한 언어 기능은 무엇입니까?

지침 :

  • CPAN이 아닌 Perl 코어에 대한 답변을 제한하십시오.
  • 예와 간단한 설명을 입력하십시오

숨겨진 기능은 다른 언어의 숨겨진 기능에서도 찾을 수 있습니다.

(이것들은 모두 Corion의 답변 에서 온 것입니다 )

    • 더프의 장치
    • 휴대 성과 표준 성
  • 씨#
    • 공백으로 구분 된 목록 및 문자열에 대한 따옴표
    • 별칭 네임 스페이스
  • 자바
    • 정적 이니셜 라이저
  • 자바 스크립트
    • 기능은 일등 시민입니다
    • 블록 범위 및 폐쇄
    • 변수를 통해 간접적으로 메소드 및 접근자를 호출
  • 루비
    • 코드를 통한 메소드 정의
  • PHP
    • 광범위한 온라인 문서
    • 마술 방법
    • 상징적 참조
  • 파이썬
    • 한 줄 값 교환
    • 핵심 기능조차도 자신의 기능으로 대체하는 기능

다른 숨겨진 기능 :

연산자 :

인용 구조 :

구문과 이름 :

모듈, Pragma 및 명령 줄 옵션 :

변수:

루프 및 흐름 제어 :

정규식 :

다른 기능들:

다른 속임수와 메타 답변 :


또한보십시오:



답변

flip-flop 연산자는 플래그 변수를 사용하지 않고 파일 핸들이 반환 한 레코드 (일반적으로 행)를 반복 할 때 첫 번째 반복을 건너 뛰는 데 유용합니다.

while(<$fh>)
{
  next if 1..1; # skip first record
  ...
}

perldoc perlop자세한 정보와 예제를 보려면 “플립 플롭”을 실행 하고 검색 하십시오 .


답변

Perl에는 많은 명백한 기능이 있습니다.

예를 들어,시길 뒤에 공백이있을 수 있다는 것을 알고 있습니까?

 $ perl -wle 'my $x = 3; print $ x'
 3

또는 기호 참조를 사용하는 경우 하위 번호를 지정할 수 있습니까?

$ perl -lwe '*4 = sub { print "yes" }; 4->()'
yes

“bool”유사 연산자도 있습니다.이 연산자는 실제 표현식에 대해서는 1을 반환하고 false에 대해서는 빈 문자열을 반환합니다.

$ perl -wle 'print !!4'
1
$ perl -wle 'print !!"0 but true"'
1
$ perl -wle 'print !!0'
(empty line)

다른 흥미로운 것들 : use overload문자열 리터럴과 숫자를 오버로드 할 수 있습니다 (예 : BigInts 또는 무엇이든 만들 수 있습니다).

이러한 것 중 많은 부분이 실제로 어딘가에 문서화되거나 문서화 된 기능을 논리적으로 따릅니다. 그럼에도 불구하고 일부는 잘 알려져 있지 않습니다.

업데이트 : 또 다른 좋은 것. q{...}인용 구조 아래 에 언급되었지만 문자를 구분 기호로 사용할 수 있다는 것을 알고 있습니까?

$ perl -Mstrict  -wle 'print q bJet another perl hacker.b'
Jet another perl hacker.

마찬가지로 정규 표현식을 작성할 수 있습니다.

m xabcx
# same as m/abc/


답변

magic ARGV 를 통해 압축 파일에 대한 지원 추가 :

s{
    ^            # make sure to get whole filename
    (
      [^'] +     # at least one non-quote
      \.         # extension dot
      (?:        # now either suffix
          gz
        | Z
       )
    )
    \z           # through the end
}{gzcat '$1' |}xs for @ARGV;

(셸 메타 문자가있는 파일 이름을 처리하는 데 필요한 $ _ 주위 인용)

이제이 <>기능은 @ARGV“.gz”또는 “.Z”로 끝나는 파일을 압축 해제합니다 .

while (<>) {
    print;
}


답변

Perl에서 가장 좋아하는 기능 중 하나는 부울 ||연산자를 사용하여 선택 세트를 선택하는 것입니다.

 $x = $a || $b;

 # $x = $a, if $a is true.
 # $x = $b, otherwise

이것은 다음과 같이 쓸 수 있음을 의미합니다.

 $x = $a || $b || $c || 0;

에서 최초의 진정한 값을합니다 $a, $b그리고 $c, 또는 디폴트의0 그렇지.

Perl 5.10에는 //정의 된 경우 왼쪽을 반환하고 그렇지 않으면 오른쪽을 반환 하는 연산자 도 있습니다 . 다음 선택하는 제 정의 된 값에서 $a, $b, $c, 또는 0그렇지

$ x = $ a // $ b // $ c // 0;

또한 짧은 형식과 함께 사용할 수 있으며 기본값을 제공하는 데 매우 유용합니다.

$ x || = 0; # $ x가 false이면 이제 값이 0입니다.

$ x // = 0; # $ x가 정의되지 않은 경우 이제 값이 0입니다.

안녕,


답변

++와 단항 연산자는 숫자뿐만 아니라 문자열에서도 작동합니다.

my $_ = "a"
print -$_

인쇄 -a

print ++$_

인쇄 b

$_ = 'z'
print ++$_

인쇄의 AA


답변

펄은 다른리스트에서 거의 모든 “비평”적인 부분을 가지고 있기 때문에 펄이 할 수없는 한 가지를 말씀 드리겠습니다.

Perl이 할 수없는 것은 //연산자가 정규식에 사용 되기 때문에 코드에 임의의 URL이없는 것입니다 .

Perl이 제공하는 기능이 확실하지 않은 경우를 대비하여 다음과 같은 항목이 명확하지 않을 수 있습니다.

더프의 장치

양도 및 Standardness은C 컴파일러보다 펄 가능성이 더 컴퓨터가 있습니다

파일 / 경로 조작 클래스파일 :: 닷넷보다 더 많은 운영 체제에서 작품을 찾기

공백으로 구분 된 목록 시세 및 문자열펄은 당신이 당신의 목록 및 문자열 구분 기호 거의 임의의 따옴표를 선택할 수 있습니다

별칭 네임 스페이스-Perl 은 glob 할당을 통해 다음과 같은 기능을 제공합니다.

*My::Namespace:: = \%Your::Namespace

정적 이니셜 라이저 -Perl은 BEGIN(코드 구문 분석) 에서 (코드 구문 분석 CHECK후)까지 import(모듈 가져 오기에서)까지 new(객체 인스턴스화)에서 DESTROY(객체 파괴)에서 END(프로그램 종료) 까지 거의 모든 컴파일 및 객체 인스턴스화 단계에서 코드를 실행할 수 있습니다.

함수는 퍼스트 클래스 시민 -펄처럼

블록 범위 및 클로저 -Perl

변수를 통해 간접적으로 메소드 및 접근자를 호출-Perl 도 다음을 수행합니다.

my $method = 'foo';
my $obj = My::Class->new();
$obj->$method( 'baz' ); # calls $obj->foo( 'baz' )

코드를 통해 방법을 정의펄 그것도 할 수 있습니다 :

*foo = sub { print "Hello world" };

퍼베이시브 온라인 설명서펄 문서도 시스템에 온라인 및 가능성

“존재하지 않는”함수를 호출 할 때마다 호출되는 매직 메소드 -Perl은 AUTOLOAD 함수에서이를 구현합니다.

상징적 참조 -이것들로부터 멀리 떨어져있는 것이 좋습니다. 그들은 당신의 아이들을 먹을 것입니다. 물론 펄은 아이들에게 피에 목 마른 악마를 제공 할 수 있습니다.

한 줄의 값 교환 -Perl은 목록 할당을 허용합니다

핵심 기능조차도 자신의 기능으로 대체하는 기능

use subs 'unlink';
sub unlink { print 'No.' }

또는

BEGIN{
    *CORE::GLOBAL::unlink = sub {print 'no'}
};

unlink($_) for @ARGV


답변

자생 . AFAIK 다른 언어는 없습니다 .