Каков самый легкий или самый эффективный способ преобразовать сокращение месяца в число в Perl? (т.е. “январь” к 1)

Один из способов сделать это - использовать контекстный API React, но вам придется обернуться довольно высоко в DOM, чтобы иметь возможность предоставлять установщики и получатели содержимого заголовка откуда угодно.

Компоненты заголовка будут выглядеть так:

const HeaderContext = React.createContext();

// Provides the context and state - wrap app
export class HeaderProvider extends React.Component {
  state = {};
  render() {
    const { children } = this.props;
    return (
       this.setState({ header })
        }}
      >
        {children}
      
    );
  }
}
// Wrapper around WHERE the header will be rendered
export function HeaderPlacement() {
  return (
    {({ header }) => header}
  );
}
// Wrapper for setting the header CONTENT
export function HeaderPortal({ children }) {
  return (
    
      {({ header, setHeader }) => 
        !header // Guard against setting the header in an endless loop
        && setHeader({ header: children })}
    
  );
}

И тогда использование будет выглядеть так:

function App() {
  return (
    
      
); } function Page() { return (

Page A Test

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In ex odio, eleifend in consequat nec, maximus lobortis ligula. Duis elementum, diam et imperdiet pulvinar, nulla ligula commodo elit, ac ullamcorper justo mauris quis velit.
); }

Вам нужно быть осторожным, если несколько потомков попытаются установить содержимое заголовка, потому что вы либо столкнетесь с проблемой зацикливания setState, либо одна перезапишет другую.

Это определенно не единственный способ, и я избегал использования хуков, но это, безусловно, и способ React-y.

Проверьте коды и окно здесь: https://codesandbox.io/s/pj2q10700j

7
задан Joe Doyle 1 May 2012 в 00:12
поделиться

9 ответов

одолженный отсюда

%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"}
21
ответ дан 6 December 2019 в 04:51
поделиться

Вот еще один способ сделать это:

my %month; @month{qw/jan feb mar apr may jun
                     jul aug sep oct nov dec/} = (1 .. 12);
10
ответ дан 6 December 2019 в 04:51
поделиться

Импорт такого модуля вряд ли будет стоить так большой памяти, что необходимо воздержаться от него, хотя в этом случае, вероятно, простой хеш был бы так же хорош. Что-то как

my %number_for = (
    jan => 1,
    feb => 2,
#etc...
);
#...
do_something_with($number_for{$month})
9
ответ дан 6 December 2019 в 04:51
поделиться
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 );
};
2
ответ дан 6 December 2019 в 04:51
поделиться

Хм - кажется, существует много чрезмерно сложных способов сделать это. Для чего-то эта простая ясность является ключевой:

# 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.";
2
ответ дан 6 December 2019 в 04:51
поделиться

Другой способ сделать это использование части хеша:

@month{qw(jan feb mar apr may jun jul aug sep oct nov dec)} = 1..12;
2
ответ дан 6 December 2019 в 04:51
поделиться

Обратите внимание также, что ключи хеша чувствительны к регистру; в зависимости от того, где Ваши сокращения происходят от Вас, может хотеть вниз-заключить-в-корпус их сначала для соответствия ключам хеша.

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

$month_number = $mon_2_num{lc($month_name_abbrev)};
2
ответ дан 6 December 2019 в 04:51
поделиться

Это зависит от того, сколько управления датой Вы намереваетесь сделать. Сначала Вы, вероятно, более обеспечены с прокруткой руки это, например.

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. Или можно найти модуль даты/времени больше подходящим потребностей; это выходит за рамки этого вопроса.

Примите во внимание также, что некоторое авторазделение использования модулей, где только те части модуля, которые необходимы, загружаются. Кроме того, основное влияние производительности использования большого модуля является не обязательно RAM, это, вероятно, более вероятно, будет время/ЦП наверху загрузки и компиляции его, прежде чем любой Ваш код когда-либо работал.

1
ответ дан 6 December 2019 в 04:51
поделиться

Определенно хеш, как предложили другие.

0
ответ дан 6 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: