Perl crypt()表现得很奇怪

时间:2014-04-22 09:14:07

标签: perl cgi crypt

我正在使用下面的函数为一次性下载链接创建一个哈希值(最初来自perlmonks)。奇怪的是我总是得到相同的哈希结果。

我一直在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 个答案:

答案 0 :(得分:2)

您希望关闭@_中的第一项,而不是尝试阅读子资料中的$_

my $exp = shift;

my ($exp) = @_;

my $exp = $_[0];

来自perlsub

  

传入的任何参数都显示在数组@_中。因此,如果您使用两个参数调用函数,那么这些参数将存储在$_[0]$_[1]中。数组@_是一个本地数组,但其元素是实际标量参数的别名。

答案 1 :(得分:1)

sub的参数将在@_中传递,而不是$_

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;会暗示你犯了这个错误。