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

ハッシュ キーでは大文字と小文字が区別されることにも注意してください。略語の由来によっては、ハッシュ キーと一致させるために、最初に略語を小文字にする必要がある場合があります。

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

$month_number = $mon_2_num{lc($month_name_abbrev)};
于 2008-10-28T21:06:07.320 に答える
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 に答える
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 などの単純な作業のいくつかを行う方が簡単な場合があります。または、ニーズにより適した日付/時刻モジュールを見つけることができます。それはこの質問の範囲を超えています。

一部のモジュールは autosplit を使用していることにも注意してください。この場合、モジュールの必要な部分のみがロードされます。また、大規模なモジュールを使用することによる主なパフォーマンスへの影響は、必ずしも 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 に答える