假设我有一个文件main.pl和一个包package.pm
在www.example.com中main.pl我得到了函数
sub GetTimestampFromDateStr {
my $date_str = shift;
$logger->debug("[GetTimestampFromDateStr]:(Checking date \"$date_str\"\n"); # Here
my $unix_timestamp;
if ( $date_str =~ /^\d{8}\.\d{6}$/ ) { # Here
$unix_timestamp =
Time::Piece->strptime( $date_str, '%Y%m%d.%H%M%S' )->epoch();
}
else {
$logger->error( # Here
"[GetTimestampFromDateStr]:(Invalid date format for \"$date_str\", must be \"%Y%m%d.%H%M%S\" i.e. \"20170125.123500\"\n"
);
}
return $unix_timestamp;
}
调用它的是
sub DATESORT {
my $TYPE = shift;
my $ts_a = GetTimestampFromDateStr($a);
my $ts_b = GetTimestampFromDateStr($b);
if ( lc($TYPE) eq "desc" ) {
$ts_b <=> $ts_a;
}
else {
$ts_a <=> $ts_b;
}
}
用作排序函数&通过sort { DATESORT('ASC') } @tran_dates_to_load
当函数和函数调用都在同一个文件中时,一切都很正常。当将函数原样移动到www.example.com时package.pm,它突然引发了一系列未初始化值的错误。
使用Perl 5.16.3.
2条答案
按热度按时间qyyhg6bp1#
$a
和$b
是包变量,因此无法跨包边界轻松访问。演示:您可以通过完全引用变量来解决此问题:
然而,这将一个假设硬编码到
Foo::bar()
中--它现在假设总是从main
调用它。多亏了
caller
,您可以消除硬编码,尽管它有点难看:更好的解决方案是将
$a
和$b
作为函数参数传递。7fhtutme2#
在只有 n 个日期的情况下,调用
GetTimestampFromDateStr
2n* log 2(n)* 次的代价有点高,这意味着16个日期会导致128次日期转换,这是一种巨大的浪费。我建议使用Sort::Key来解决这个问题。
您正在执行
lc($TYPE) eq "desc"
检查 2n* log 2(n)* 次,而它只需要执行一次。我建议将检查从比较函数中移出以解决此问题。
也就是说,没有理由转换日期在所有给定的格式,他们使用!