LINUX.ORG.RU

Перл: опции


0

0

нужно распарсить опции, где может быть несколько одинаковых опций: -U aaa -U bbb

Для одинаковых опций нужно получать список [ aaa, bbb ]

Каким модулем, как сделать?

★★★★★

Ответ на: комментарий от friday

GetOpt::Std я уже пробовал -- он не умеет делать списки из значений одинаковой опции. То есть в случае нескольких опций -Uaaa -Ubbb значение будет только bbb

Конечно можно самому разбивать строку и по частям ее парсить, но как-то теряется смысл модуля

dilmah ★★★★★
() автор топика
Ответ на: комментарий от kto_tama

мне не нужен список модулей, мне нужен модуль который умеет делать конкретную задачу

dilmah ★★★★★
() автор топика
Ответ на: комментарий от dilmah

и еще чтобы этот модуль инсталлировался emerge'м

dilmah ★★★★★
() автор топика
Ответ на: комментарий от dilmah

блин, GetOpt::Long это здорово, но он по моему не понимает коротких опций

dilmah ★★★★★
() автор топика

> Для одинаковых опций нужно получать список [ aaa, bbb ]

Как-нибудь так:

my %args;
while (@ARGV) 
{ 
  my ($key, $val) = splice @ARGV, 0, 2; 
  push @{$args{$key}}, $val
};


`--> perl test.pl zz 88 zz 44 ee 99
$VAR1 = {
          'zz' => [
                    '88',
                    '44'
                  ],
          'ee' => [
                    '99'
                  ]
        };

swizard
()
Ответ на: комментарий от friday

> это все хорошо, конечно, но могут быть опции и без значений, я полагаю

:)

my %args;
while (@ARGV)
{
  my ($key, $val) = splice @ARGV, 0, 2;
  if ($val =~ /^-/o)
  {
    unshift @ARGV, $val;
    undef $val;
  }
  push @{$args{$key}}, ($val ? $val : ())
};

`--> ./zz.pl -zz 99 -zz 88 -kk -qq -ii 66
$VAR1 = {
          '-kk' => [],
          '-qq' => [],
          '-zz' => [
                     '99',
                     '88'
                   ],
          '-ii' => [
                     '66'
                   ]
        };

swizard
()
Ответ на: комментарий от swizard

а еще опции можно задавать без пробела между опцией и аргументом: head -n1 эквивалентно head -n 1

dilmah ★★★★★
() автор топика
Ответ на: комментарий от friday

вообще я уже написал свой велосипед без модулей

Getopt::Mixed написано что obsoleted, потому что Getopt::Long уже поддерживает и короткие опции. Но Getopt::Long не поддерживает отсутствие пробела между опцией и аргументом.

А самому править Getopt::Long неприемлемо -- это ж придется тащить в проект кучу кода, ну его нафиг.

dilmah ★★★★★
() автор топика
Ответ на: комментарий от dilmah

> Но Getopt::Long не поддерживает отсутствие пробела между опцией и аргументом.

Поддерживает, только не по умолчанию. Нужно включить опцию "bundling".

Getopt::Long::Configure("bundling");

amm
()
Ответ на: комментарий от amm

балин:) уже поздно, велосипед едет

dilmah ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.