월의 약어를 Perl의 숫자로 변환하는 가장 쉽거나 효과적인 방법은 무엇입니까? (즉,“Jan”에서 1)

StackOverflow https://stackoverflow.com/questions/241579

  •  04-07-2019
  •  | 
  •  

문제

방법을 사용하기 위해 라이브러리를 가져 오면 그만한 가치가 있습니까? 가져 오는 것이 많은 메모리를 차지합니까?

도움이 되었습니까?

해결책

빌린 여기

%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"}

다른 팁

여기에 또 다른 방법이 있습니다.

my %month; @month{qw/jan feb mar apr may jun
                     jul aug sep oct nov dec/} = (1 .. 12);

이러한 모듈을 가져 오는 것은 당신이 그것을 삼가야하는 많은 메모리 비용이 들지는 않지만,이 경우 간단한 해시는 아마도 좋을 것입니다. 같은 것

my %number_for = (
    jan => 1,
    feb => 2,
#etc...
);
#...
do_something_with($number_for{$month})
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 )
);

또는 사용 지퍼 기능:

my %month_num = do {
    my @month = qw( jan feb mar apr may jun jul aug sep oct nov dec );
    zip2( 1 .. 1+$#month, @month );
};

흠 -이 작업을 수행하는 지나치게 복잡한 방법이 많이있는 것 같습니다. 이 간단한 선명도는 핵심입니다.

# 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.";

해시 키는 케이스에 민감합니다. 약어가 어디에서 오는지에 따라 해시 키와 일치하도록 먼저 하향식을 원할 수 있습니다.

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

$month_number = $mon_2_num{lc($month_name_abbrev)};

해시 슬라이스를 사용하여이를 수행하는 또 다른 방법 :

@month{qw(jan feb mar apr may jun jul aug sep oct nov dec)} = 1..12;

그것은 당신이 의도하고있는 날짜 조작의 양에 따라 다릅니다. 처음에는 손으로 롤링하는 것이 더 나을 것입니다.

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 (숫자의 숫자)에서 매핑합니다. 코드의 성능 병목 현상은 이러한 종류의 코드에 있지 않을 것이며, 네트워크, 데이터베이스 또는 디스크 액세스 코드에 있으므로 코드를 읽을 수 있도록 집중하십시오.)

코드에 추가하기 시작하면이 물건의 많은 부분이 기존 모듈에 의해 이미 수행되었으며 예를 들어 :: calc. 또는 귀하의 요구에 더 적합한 날짜/시간 모듈을 찾을 수 있습니다. 그것은이 질문의 범위를 벗어납니다.

또한 일부 모듈은 AutoSplit을 사용하는데, 필요한 모듈의 부분 만로드됩니다. 또한 큰 모듈을 사용하는 주요 성능이 반드시 RAM은 아닙니다. 코드가 실행되기 전에로드 및 컴파일의 시간/CPU 오버 헤드 일 가능성이 높을 것입니다.

다른 사람들이 제안한대로 확실히 해시.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top