Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ($a, $b, $c) = split /~/, $line, Как присвоить undef ? 
:(
    Опции темы
Suppir
Дата 2.4.2011, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



есть строки вида:

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

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

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

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

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


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

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


Это сообщение отредактировал(а) Suppir - 2.4.2011, 19:47
PM MAIL   Вверх
Pfailed
Дата 2.4.2011, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



($type, $num, $date) = "приказ~~02.02.2010~" =~ /([^~]+)?~([^~]+)?~([^~]+)?~/


--------------------
PM MAIL   Вверх
arto
Дата 2.4.2011, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



map { $_ || undef }
PM MAIL ICQ   Вверх
Suppir
Дата 3.4.2011, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



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


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

Код

$num || $num = undef


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

Код

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


?

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











Это сообщение отредактировал(а) Suppir - 3.4.2011, 09:14
PM MAIL   Вверх
mishnik
Дата 7.4.2011, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 6.3.2011

Репутация: 1
Всего: 1



я делаю так
Код

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".



Это сообщение отредактировал(а) mishnik - 7.4.2011, 19:16
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1275 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.