월의 약어를 Perl의 숫자로 변환하는 가장 쉽거나 효과적인 방법은 무엇입니까? (즉,“Jan”에서 1)
-
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 오버 헤드 일 가능성이 높을 것입니다.
다른 사람들이 제안한대로 확실히 해시.