我正在使用下面的函数为一次性下载链接创建一个哈希值(最初来自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";
答案 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;
会暗示你犯了这个错误。