2014-04-22 8 views
0

아래의 함수를 사용하여 일회성 다운로드 링크 (원래 perlmonks에서)의 해시를 만듭니다. 이상한 일은 항상 같은 해시 결과를 얻는 것입니다.이상한 연기 Perl crypt()

나는 RTFMing을 해왔다. crypt() 함수가 $ exp의 마지막 8 문자를 가져 왔는지 확인하고 $ exp가 실제로 변경되었는지 확인했습니다. 나는 또한 crypt() 함수에 무작위 값을 수동으로 공급하려고 시도했다. 제대로 작동 한 것만 해시 결과가 변경되었다.

무엇이 여기에 있습니까?

use strict; 
use CGI; 

sub chash { 
my $exp = $_; 
my $key = 'abcd1234'; //not actual key 
my $hash = crypt(substr($exp,-8,8),$key); 
$hash = substr($hash, 2); 
$hash =~ s/[^a-zA-Z0-9]//g; $hash = uc($hash); 

return $hash; 
} 

my $exp = time() + 60;  
my $hash = chash($exp); 
my $download_url="http://script.pl?$exp-$hash"; 

답변

2

당신은 대신 하위에 $_을 읽는의 @_ 오프 첫 번째 항목을 끌어합니다. perlsub에서

my $exp = shift; 

또는

my ($exp) = @_; 

또는

my $exp = $_[0]; 

: 배열 @_에 쇼까지 전달

모든 인수입니다. 따라서 두 개의 인수가있는 함수를 호출하면 그 값은 $_[0]$_[1]에 저장됩니다. 배열 @_은 로컬 배열이지만 그 요소는 실제 스칼라 매개 변수의 별명입니다. sub

1

매개 변수가없는 $_@_에 전달됩니다.

use strict; 
use warnings ; 
use CGI; 

sub chash { 
    my ($exp) = @_; 
    my $key = 'abcd1234'; # not actual key 
    my $hash = crypt(substr($exp,-8,8),$key); 
    $hash = substr($hash, 2); 
    $hash =~ s/[^a-zA-Z0-9]//g; 
    $hash = uc($hash); 

    return $hash; 
} 

my $exp = time() + 60;  
my $hash = chash($exp); 
my $download_url="http://script.pl?$exp-$hash"; 

use warnings;을 사용하면이 실수를 암시 할 수 있습니다.