Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > ($a, $b, $c) = split /~/, $line


Автор: Suppir 2.4.2011, 19:31
есть строки вида:

приказ~N 100~01.02.2010~
приказ~N 110~02.02.2010~

т.е. сначала идет $тип, потом $номер, потом $дата. Разделителем служит символ "~", в конце строки также есть этот символ.

Однако в строках могут быть пропущены какие-либо параметры:

приказ~~02.02.2010~
приказ~N110~~

Необходимо из строки вытащить все переменные, какие есть. Пишу:


($type, $num, $date) = split /~/, $_

Однако в случае, если какого-нибудь параметра не хватает в строке, нужно, чтобы переменная принимала значение undef. Как это сделать?
В настоящий же момент при отсутствии в строке, скажем, даты, переменная $date принимает значение "", т.е. пустой строке. А нужно undef.

Автор: Pfailed 2.4.2011, 21:41
($type, $num, $date) = "приказ~~02.02.2010~" =~ /([^~]+)?~([^~]+)?~([^~]+)?~/

Автор: arto 2.4.2011, 22:55
map { $_ || undef }

Автор: Suppir 3.4.2011, 09:08
Спасибо, оба варианта работают. Правда, с учетом того, что переменных всего 15, выглядят эти конструкции довольно страшно smile
Но все равно лучше, чем потом для каждой переменной писать: if ($num ne ""){} else {}


Еще вот что интересно. Если написать:

Код

$num || $num = undef


Разве это не эквивалентно 

Код

unless (defined $num){$num = undef}


?

Но ведь $num как раз defined и равен "".










Автор: mishnik 7.4.2011, 19:05
я делаю так
Код

my $EMPTY          = q{};
my ($type, $num, $date)  = ($EMPTY, $EMPTY, $EMPTY,);
($type, $num, $date) = split /~/, $_

и спокоен,если что не найдется, все нужно инициализировать!
даже ссылки на массив и хэш
Код

my @empty          = ();
my $ref_arr_empty  = \@empty;
my %hash_empty     = ();
my $ref_hash_empty = \@empty;


Добавлено @ 19:15
Цитата(Suppir @  3.4.2011,  09:08 Найти цитируемый пост)
Но ведь $num как раз defined и равен "".

пиши яснее
вот тест test_undef.t:
Код

use Test::More tests => 1;
my $EMPTY = q{};
my $UNDEF = undef;
$num=$EMPTY;
if (defined $num){$num = undef}
is( $num, $UNDEF, "is equal" );

выдает
Код

1..1
ok 1 - is equal



писать
Код

unless (defined $num){$num = undef}

дурной тон perlcritic не пропустит
и заявит
Код

DESCRIPTION
Conway discourages using "unless" because it leads to double-negatives that are hard to understand. Instead, reverse the logic and use "if".

        unless($condition) { do_something() } #not ok
        unless(! $no_flag) { do_something() } #really bad
        if( ! $condition)  { do_something() } #ok

This Policy only covers the block-form of "unless". For the postfix variety, see "ProhibitPostfixControls".


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)