8

如果我导入一个库来使用一种方法,是否值得?导入会占用大量内存吗?

4

10 回答 10

22

从这里借来的

%mon2num = qw(
    jan 1  feb 2  mar 3  apr 4  may 5  jun 6
    jul 7  aug 8  sep 9  oct 10 nov 11 dec 12
);

并检索

$mon2num{"jan"}
于 2008-10-27T22:27:16.657 回答
11

这是另一种方法:

my %month; @month{qw/jan feb mar apr may jun
                     jul aug sep oct nov dec/} = (1 .. 12);
于 2008-10-28T02:09:18.753 回答
10

导入这样的模块不太可能花费太多的内存,您应该避免使用它,尽管在这种情况下,一个简单的散列可能同样好。就像是

my %number_for = (
    jan => 1,
    feb => 2,
#etc...
);
#...
do_something_with($number_for{$month})
于 2008-10-27T22:25:12.917 回答
3

使用哈希切片的另一种方法:

@month{qw(jan feb mar apr may jun jul aug sep oct nov dec)} = 1..12;
于 2008-10-29T23:45:36.203 回答
2
my %month_num = do { my $i = 1; map {; $_ => $i++ } (
    qw( jan feb mar apr may jun jul aug sep oct nov dec )
) };

或许:

my %month_num;
$month_num{ $_ } = 1 + keys %month_num for (
    qw( jan feb mar apr may jun jul aug sep oct nov dec )
);

或使用zip 功能

my %month_num = do {
    my @month = qw( jan feb mar apr may jun jul aug sep oct nov dec );
    zip2( 1 .. 1+$#month, @month );
};
于 2008-10-28T00:31:10.107 回答
2

嗯 - 似乎有很多过于复杂的方法可以做到这一点。对于某些事情,这个简单的清晰度是关键:

# create a lookup table of month abbreviations to month numbers
my %month_abbr_to_number_lkup = (
    jan => 1,
    feb => 2,
    mar => 3,
    apr => 4,
    may => 5,
    jun => 6,
    jul => 7,
    aug => 8,
    sep => 9,
    oct => 10,
    nov => 11,
    dec => 12,
);

# get the number for a month
my $number = $month_abbr_to_number_lkup{$abbr}
    || die "Could not convert month abbreviation '$abbr' to a number.";
于 2008-10-28T17:57:14.270 回答
2

另请注意,哈希键区分大小写;根据您的缩写来自哪里,您可能希望首先将它们小写以匹配哈希键。

%mon_2_num = (jan => 1,
              feb => 2,
              ...);

$month_number = $mon_2_num{lc($month_name_abbrev)};
于 2008-10-28T21:06:07.320 回答
1

这取决于您打算进行多少日期操作。起初你可能会更好地用手滚动它,例如

my @months = qw(Jan Feb Mar Apr May Jun
                Jul Aug Sep Oct Nov Dec);
my %monthnum = map { $_ => $months[ $_ - 1 ] } 1..12;

(我更喜欢这种方法,因为你在做什么比较明显——你有一个月份列表,然后你将它们从 1..12(对人类有意义的数字)映射到 0..11(对人类有意义的数字)对计算机有意义)。代码中的性能瓶颈不会出现在这类代码中,它们会出现在网络、数据库或磁盘访问代码中,因此请专注于使代码可读。)

当您开始添加代码时,您可能会发现很多这些东西已经由现有模块完成,使用 Date::Calc 等一些简单的东西可能会更容易。或者您可能会找到更适合您需求的日期/时间模块;这超出了这个问题的范围。

还请记住,某些模块使用自动拆分,仅加载需要的模块部分。此外,使用大型模块的主要性能影响不一定是 RAM,它可能更可能是在任何代码运行之前加载和编译它的时间/CPU 开销。

于 2008-10-28T03:59:28.390 回答
0

正如其他人所建议的那样,绝对是一个哈希。

于 2008-10-28T12:42:48.537 回答
0

我喜欢有机会在一个 12 岁的问题上做 TMTOWTDI!

正如其他人提到的,哈希值将区分大小写。所以让我们改用正则表达式!

my $months = '1=January 2=February 3=March 4=April 5=May 6=June 7=July 8=August 9=September 10=October 11=November 12=December';

my $month = 'jan'; # anything that looks like a month name
my $monthnumber = $1 if $months =~ m"(\d+)=$month"i;
my $monthname = $1 if $months =~ m"$monthnumber=(\S+)";
my $monthabbreviation = $1 if $months =~ m"$monthnumber=(...)";

这是一个示例,显示了它的灵活性:

foreach my $month ('jan', 'Feb','MAR','Ap','May','Jun','july','Aug','sep','oct','NOVEM','DECEMBER') {
    my $monthnumber = $1 if $months =~ m"(\d+)=$month"i;
    my $monthname = $1 if $months =~ m"$monthnumber=(\S+)";
    my $monthabbreviation = $1 if $months =~ m"$monthnumber=(...)";
    printf "    %-9s %2d %3s %s\n",$month,$monthnumber,$monthabbreviation,$monthname;
}

输出:

jan        1 Jan January
Feb        2 Feb February
MAR        3 Mar March
Ap         4 Apr April
May        5 May May
Jun        6 Jun June
july       7 Jul July
Aug        8 Aug August
sep        9 Sep September
oct       10 Oct October
NOVEM     11 Nov November
DECEMBER  12 Dec December
于 2020-07-25T21:33:22.493 回答