Perl의 숨겨진 기능은 무엇입니까?



14 Answers

Perl에는 많은 명백하지 않은 기능이 있습니다.

예를 들어, sigil 후에 공간이있을 수 있다는 것을 알고 있습니까?

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

또는 기호 참조를 사용하는 경우 숫자로 된 서브 이름을 지정할 수 있습니까?

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

또한 "bool"준 연산자는 true 표현식에 대해서는 1을 반환하고 false에 대해서는 빈 문자열을 반환합니다.

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

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

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

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

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

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

m xabcx
# same as m/abc/
Question

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

지침 :

  • CPAN이 아닌 Perl 코어에 대한 응답을 제한하십시오.
  • 예와 간단한 설명을주세요.

숨겨진 기능은 다른 언어에서도 볼 수 있습니다. '숨겨진 기능 :

(이것들은 모두 코리온의 대답 에서 나온 것입니다 )

  • C
    • 더프의 장치
    • 휴대 성과 표준
  • C#
    • 공백으로 단락 지어진리스트 및 캐릭터 라인의 인용문
    • 별명 지정 가능한 네임 스페이스
  • Java
    • 정적 Initalizers
  • JavaScript
    • 기능은 퍼스트 클래스 시민들입니다.
    • 블록 범위 및 종료
    • 변수를 통해 간접적으로 메소드와 접근자를 호출
  • Ruby
    • 코드를 통한 메서드 정의
  • PHP
    • 퍼베이시브 온라인 문서
    • 매직 방법
    • 기호식 참조
  • Python
    • 하나의 라인 값 교환
    • 핵심 기능까지도 사용자 고유의 기능으로 대체 할 수 있습니다.

기타 숨겨진 기능 :

운영자 :

인용 구문 :

구문 및 이름 :

모듈, Pragma 및 명령 행 옵션 :

변수:

루프 및 흐름 제어 :

정규 표현식 :

다른 기능들:

기타 트릭 및 메타 답변 :

참조 :




Perl에서 가장 좋아하는 기능 중 하나는 부울을 사용하는 것입니다. 연산자를 사용하여 일련의 선택 중에서 선택하십시오.

 $x = $a || $b;

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

즉, 다음을 작성할 수 있습니다.

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

$a , $b$c 에서 첫 번째 true 값을 가져 오거나 그렇지 않으면 기본값 0 을 취합니다.

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

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

또한 짧은 양식을 사용하여 기본값을 제공하는 데 매우 유용합니다.

$x ||= 0;   # If $x was false, it now has a value of 0.

$x //= 0;   # If $x was undefined, it now has a value of zero.

안녕,




이진 "x"는 반복 연산자입니다 .

print '-' x 80;     # print row of dashes

또한 목록과도 작동합니다.

print for (1, 4, 9) x 3; # print 149149149



Perl 5에서 "-n""-p" 스위치가 구현되는 방식에 따라 겉으로보기에는 틀린 프로그램을 작성할 수 있습니다. 예를 들어 }{ :

ls |perl -lne 'print $_; }{ print "$. Files"'

이 코드는 내부적으로 다음과 같이 변환됩니다.

LINE: while (defined($_ = <ARGV>)) {
    print $_; }{ print "$. Files";
}



Perl에서 거의 모든 종류의 이상한 문자열을 인용하는 것은 간단합니다.

my $url = q{http://my.url.com/any/arbitrary/path/in/the/url.html};

사실 Perl의 다양한 인용 메커니즘은 매우 흥미 롭습니다. Perl 정규식과 같은 인용 메커니즘을 사용하면 구분 기호를 지정하여 모든 것을 인용 할 수 있습니다. #, /, 또는 (), [] 또는 {}와 같은 개폐 문자와 같은 거의 모든 특수 문자를 사용할 수 있습니다. 예 :

my $var  = q#some string where the pound is the final escape.#;
my $var2 = q{A more pleasant way of escaping.};
my $var3 = q(Others prefer parens as the quote mechanism.);

인용 메커니즘 :

q : 리터럴 인용; 이스케이프해야하는 문자 만 끝 문자입니다. qq : 해석 된 따옴표. 변수와 이스케이프 문자를 처리합니다. 인용 할 필요가있는 문자열에 적합합니다.

my $var4 = qq{This "$mechanism" is broken.  Please inform "$user" at "$email" about it.};

qx : qq처럼 작동하지만, 대화식이 아닌 시스템 명령으로 실행합니다. 표준 출력에서 ​​생성 된 모든 텍스트를 반환합니다. (리다이렉션이 OS에서 지원된다면 나옵니다.) 또한 역 인용 부호 (`문자)로 끝납니다.

my $output  = qx{type "$path"};      # get just the output
my $moreout = qx{type "$path" 2>&1}; # get stuff on stderr too

qr : qq와 같은 해석을하지만 정규식으로 컴파일합니다. 정규식의 다양한 옵션과 함께 작동합니다. 이제 정규식을 변수로 전달할 수 있습니다.

sub MyRegexCheck {
    my ($string, $regex) = @_;
    if ($string)
    {
       return ($string =~ $regex);
    }
    return; # returns 'null' or 'empty' in every context
}

my $regex = qr{http://[\w]\.com/([\w]+/)+};
@results = MyRegexCheck(q{http://myurl.com/subpath1/subpath2/}, $regex);

qw : 매우 유용한 견적 연산자. 인용 된 공백 문자 세트를 목록으로 변환합니다. 단위 테스트에서 데이터 채우기에 적합합니다.


   my @allowed = qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z { });
   my @badwords = qw(WORD1 word2 word3 word4);
   my @numbers = qw(one two three four 5 six seven); # works with numbers too
   my @list = ('string with space', qw(eight nine), "a $var"); # works in other lists
   my $arrayref = [ qw(and it works in arrays too) ]; 

상황을 명확하게 할 때마다 사용하는 것이 좋습니다. qx, qq 및 q의 경우 {} 연산자를 사용하는 것이 가장 좋습니다. qw를 사용하는 사람들의 가장 보편적 인 습관은 대개 () 연산자이지만 때때로 qw //도 볼 수 있습니다.




Perl은 다른 목록의 거의 모든 "난해한"부분을 가지고 있기 때문에 Perl이 할 수없는 한 가지를 말씀 드리겠습니다.

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

단지 펄 (Perl)이 제공하는 기능이 분명하지 않은 경우를 위해, 여기에 아마도 완전히 명백하지 않은 항목의 선택적 목록이 있습니다.

더프의 장치 -

이식성과 표준성 - Perl을 사용하는 컴퓨터는 C 컴파일러보다 더 많습니다.

파일 / 경로 조작 클래스 - File :: Find는 .Net보다 많은 운영 체제에서 작동합니다.

공백으로 구분 된 목록 과 문자열에 대한 인용문 - Perl은 목록과 문자열 구분 기호에 대해 거의 임의의 따옴표를 선택할 수 있습니다

별명 지정 가능한 네임 스페이스 - Perl은 glob 할당을 통해 다음 을가집니다 .

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

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

함수는 Perl과 마찬가지로 퍼스트 클래스 시민입니다.

블록 범위와 클로저 - Perl은 둘 다 가지고있다.

변수를 통해 메서드와 접근자를 간접적으로 호출 - Perl도이를 수행합니다.

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

코드를 통해 메서드를 정의 - Perl도 허용 :

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

Pervasive 온라인 설명서 - Perl 설명서는 온라인 상태이며 시스템에서도 볼 수 있습니다.

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

상징적 인 참고 문헌 - 당신은 잘 지켜야한다. 그들은 당신의 아이들을 먹을 것입니다. 물론 Perl을 사용하면 피를 목 마른 악마에게 자녀를 제공 할 수 있습니다.

한 라인 값 스와핑 - Perl은리스트 할당을 허용합니다

핵심 기능까지도 사용자 고유의 기능으로 대체 할 수 있습니다.

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

또는

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

unlink($_) for @ARGV



루프의 continue 절. 그것은 모든 루프의 하단에서 실행될 것입니다.

while( <> ){
  print "top of loop\n";
  chomp;

  next if /next/i;
  last if /last/i;

  print "bottom of loop\n";
}continue{
  print "continue\n";
}



"for"문은 파스칼에서 "with"가 사용되는 것과 같은 방식으로 사용될 수 있습니다.

for ($item)
{
    s/&‎nbsp;/ /g;
    s/<.*?>/ /g;
    $_ = join(" ", split(" ", $_));
}

변수 이름을 반복하지 않고 동일한 변수에 일련의 s /// 연산 등을 적용 할 수 있습니다.

참고 : 위의 줄 바꿈하지 않는 공간 (& nbsp;)은 Markdown을 우회하기 위해 유니 코드를 숨겨 둡니다. 그것을 붙여 넣지 마십시오 :)




while(/\G(\b\w*\b)/g) {
     print "$1\n";
}

\ G 닻. 뜨겁다 .




tie, the variable tying interface.




염소 연산자 *:

$_ = "foo bar";
my $count =()= /[aeiou]/g; #3

또는

sub foo {
    return @_;
}

$count =()= foo(qw/a b c d/); #4

스칼라 컨텍스트에서 목록 할당은 할당 된 목록의 요소 수를 산출하기 때문에 작동합니다.

* 사실, 연산자가 아니라




rename("$_.part", $_) for "data.txt";

renames data.txt.part to data.txt without having to repeat myself.




The null filehandle diamond operator <> has its place in building command line tools. It acts like <FH> to read from a handle, except that it magically selects whichever is found first: command line filenames or STDIN. Taken from perlop:

while (<>) {
...         # code for each line
}



이것은 메타 답변이지만 Perl 팁 아카이브는 Perl로 할 수있는 모든 종류의 흥미로운 트릭을 포함합니다. 이전 팁의 아카이브는 브라우징을 위해 온라인 상태이며, 메일 링리스트 또는 원자 피드를 통해 구독 할 수 있습니다.

필자가 가장 좋아하는 팁에는 PAR사용하여 실행 파일을 빌드 하고, 자동 실행을 사용하여 예외를 자동으로 처리 하며, Perl 5.10에서 switchsmart-match 구문을 사용하는 방법이 switch .

공개 : 저는 Perl Tips의 저자이자 관리자 중 한 명입니다. 그래서 나는 분명히 그것들을 매우 높게 생각합니다. ;)




DATA 블록에 직접 붙여 넣은 데이터를 구문 분석하는 기능. 프로그램 또는 유사한 방식으로 열리는 테스트 파일에 저장할 필요가 없습니다. 예 :

my @lines = <DATA>;
for (@lines) {
    print if /bad/;
}

__DATA__
some good data
some bad data
more good data 
more good data 


Related