ما هي الطريقة الأسهل أو الأكثر فعالية لتحويل اختصار الشهر لعدد في بيرل؟ (أي "يناير" ل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 ( الأرقام التي من المنطقي أن كمبيوتر). واختناقات الأداء في التعليمات البرمجية لن يكون في هذا النوع من التعليمات البرمجية، وأنها سوف تكون في الشبكة، وقاعدة البيانات أو رمز الوصول إلى القرص، وبالتالي التركيز على جعل التعليمات البرمجية للقراءة. )

وكما يمكنك البدء في إضافة إلى التعليمات البرمجية الخاصة بك، قد تجد أن الكثير من هذه الاشياء ما يحدث بالفعل من قبل وحدات الحالية، وأنه قد يكون من الأسهل أن تفعل بعض الأشياء البسيطة مع مثل تاريخ :: احسب. أو قد تجد وحدة نمطية / التاريخ الآن أكثر ملاءمة لاحتياجاتك. هذا هو خارج نطاق هذه المسألة.

ونضع في اعتبارنا أيضا أن بعض وحدات تستخدم autosplit، حيث يتم تحميل فقط تلك الأجزاء من وحدة مطلوبة. أيضا، تأثير الأداء الرئيسي من استخدام وحدة كبيرة لا ذاكرة الوصول العشوائي بالضرورة، فإنه على الأرجح أكثر عرضة للأحمال الوقت / وحدة المعالجة المركزية التحميل وتجميع من قبل أي من التعليمات البرمجية الخاصة بك وتشغيل أي وقت مضى.

وبالتأكيد تجزئة، كما اقترح من قبل الآخرين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top