perl
  • map
  • 2010-07-20 1 views 3 likes 
    3

    다음 스크립트는 내가 원하는 것을 제공하지만 Perl도 "void 환경에서 변수를 쓸모 없게 사용하라"는 경고를 던졌습니다. 무슨 뜻이에요?이 Perl 스크립트에서 "void 컨텍스트에서 변수를 쓸모 없게 사용"한다는 것은 무엇을 의미합니까?

    use strict; 
    use warnings; 
    
    my $example = 'http\u003a//main\u002egslb\u002eku6\u002ecom/c0/q7LmJPfV4DfXeTYf/1260269522170/93456c39545857a15244971e35fba83a/1279582254980/v632/6/28/a14UAJ0CeSyi3UTEvBUyMuBxg\u002ef4v\u002chttp\u003a//main\u002egslb\u002eku6\u002ecom/c1/q7LmJPfV4DfXeTYf/1260269522170/3cb143612a0050335c0d44077a869fc0/1279582254980/v642/10/20/7xo2MJ4tTtiiTOUjEpCJaByg\u002ef4v\u002chttp\u003a//main\u002egslb\u002eku6\u002ecom/c2/q7LmJPfV4DfXeTYf/1260269522170/799955b45c8c32c955564ff9bc3259ea/1279582254980/v652/32/4/6pzkCf4iqTSUVElUA5A3PpMAoA\u002ef4v\u002chttp\u003a//main\u002egslb\u002eku6\u002ecom/c3/q7LmJPfV4DfXeTYf/1260269522170/cebbb619dc61b3eabcdb839d4c2a4402/1279582254980/v567/36/19/MBcbnWwkSJu46UoYCabpvArA\u002ef4v\u002chttp\u003a//main\u002egslb\u002eku6\u002ecom/c4/q7LmJPfV4DfXeTYf/1260269522170/1365c39355424974dbbe4ae8950f0e73/1279582254980/v575/17/15/EDczAa0GTjuhppapCLFjtaQ\u002ef4v'; 
    
    my @raw_url = $example =~ m{(http\\u003a.+?f4v)}g; 
    
    my @processed_url = map { 
              s{\\u003a}{:}g,$_; 
              s{\\u002e}{.}g,$_; 
              s{\\u002d}{@}g,$_; 
        } @raw_url; 
    
    print join("\n",@processed_url); 
    

    그런데 달러 밑줄을 생략하면 왜이지도가 작동하지 않습니까?

    my @processed_url = map { 
              s{\\u003a}{:}g; 
              s{\\u002e}{.}g; 
              s{\\u002d}{@}g; 
        } @raw_url; 
    

    달러 밑줄을 생략하면 성공 플래그 "1"을 제외하고 아무것도 얻지 못합니다. 내가 뭘 놓치고 있니? 어떤 아이디어? 감사합니다 언제나처럼 : 당신이 원하는 무엇

    답변

    9

    ...

    my @processed_url = map { 
             s{\\u003a}{:}g; 
             s{\\u002e}{.}g; 
             s{\\u002d}{@}g; 
             $_; 
    } @raw_url; 
    

    A가 map block의 결과로 평가 된 마지막 문으로 구성 값을 반환합니다. 그 이유는 우리가 $ _을 마지막 문장으로 전달하는 이유입니다. 대입 연산자 s{}{}은 대입 횟수를 반환합니다.

    이전 설정에서, 당신은 그 자체로 다음 문장을 가지고있었습니다. 어느 의미가 없으며 Perl이 경고하는 것입니다.

    s{\\u003a}{:}g, $_; 
    
    +0

    설명해 주셔서 감사합니다! 감사합니다 :) – Mike

    +1

    더 예쁜 소스에 대해, 당신은 Algorithm :: Loops의 Filter()를 사용하고 입력을 위해 $ _ – ysth

    5

    당신은 이미 당신이 찾고 있던 답을 가지고,하지만 난 map 블록 내부의 대체 연산자를 사용하는 방법에 대한 미묘을 지적하고 싶었 : 원래의 배열도 수정되고있다. 원래 배열을 유지하려면, 그것을 할 수있는 한 가지 방법 만 복사, 수정 한 후, 배열의 복사본을 만드는 것입니다 : 당신이 하나 개의 배열을 필요로하는 경우,

    my @processed_url = @raw_url; 
    for (@processed_url) { 
        s{\\u003a}{:}g; 
        s{\\u002e}{.}g; 
        s{\\u002d}{@}g; 
    } 
    

    을 또는, 당신은 원본을 원하는 수정 될 내용 :

    for (@raw_url) { 
        s{\\u003a}{:}g; 
        s{\\u002e}{.}g; 
        s{\\u002d}{@}g; 
    } 
    
    +1

    감사를 생략 할 수 있습니다. 원래 푸시를 사용했으나 작동했지만지도를 시도했지만 문제가있었습니다. 혼자서 알아낼 수 없어요. 내 원본은 다음과 같았습니다 : for (@raw_url) { s {\ u003a} {:} g; s {\ u002e} {.} g; s {\\ u002d} {@} g; \t 푸시 @processed_url, $ _; } – Mike

    관련 문제