powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl - подскажите по синтаксису
7 сообщений из 7, страница 1 из 1
Perl - подскажите по синтаксису
    #39345047
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такая строчка:
Код: php
1.
my $phone = (&check($str) ? &format($phone) : undef);


Переменная $str это строка, которая может содержать номер телефона.
Функция check проверяет, соответствует ли строка определенным требованиям и возвращает 1 (если соответствует) или undef.
Функция format нормализует и форматирует строку как телефонный номер.
Строка в целом присваивает переменной $phone отформатированный телефонный номер, если этот номер корректен.

Могу ли я заменить эту строку на такую?
Код: php
1.
my $phone = &check($str) && &format($phone);


Если check возвращает undef, то там все понятно — при "ленивом" сравнении вторая функция не выполняется и выражение сразу возвращает undef.
А вот если check возвращает 1, то в $phone оказывается результат функции format (как мне и надо), но я не уверен, что что-то не упускаю.

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Perl - подскажите по синтаксису
    #39345213
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Нагородил огород.
Опять.

Между тем обычный оператор s /ubstitute// делает
именно это - проверяет строку на соответствие определённым
требованиям и форматирует её при совпадении с последними.

Более того, можно напомнить про клёвую возможность расположить оператор s/// или m// вертикально и выполнить любой код при совпадении частей шаблона, не покидая оператор.
...
Рейтинг: 0 / 0
Perl - подскажите по синтаксису
    #39345236
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверка и форматирование у меня нелинейные, я не уверен, что смогу их вписать в регулярные выражения.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
sub check($)
{
	my $phone = shift;
	return undef unless (defined($phone));
	return undef if ($phone =~ m/(nosms)|(no sms)/i);
	$phone =~ tr/0-9//cd;
	return 1 if (length($phone) == 11 && substr($phone,0,1) eq '7');
	return undef;
}

sub format($)
{
	my $phone = shift;
	return undef unless (defined($phone));
	$phone =~ tr/0-9//cd;
	if (defined($phone))
	{
		if (length($phone) == 11 && substr($phone,0,1) eq '7')
		{
			return '+'.$phone;
		}
	}
	return undef;
}
...
Рейтинг: 0 / 0
Perl - подскажите по синтаксису
    #39345253
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно ещё наплюнуть на приличия и применить флип-флоп оператор троеточие: A ... B

выглядеть это будет так:
Код: perl
1.
2.
chk ... fmt for $string, $phone;
print $phone;




как это работает:
на первом проходе оператор for отдаст в тело цикла $string , поместив ссылку на последнюю в переменную $_ .
Флип-флоп первым делом дёрнет chk();
если chk() после вернёт true, то флип-флоп сработает, запомнит состояние и возвратится, приготовившись на следующем вызове дёрнуть fmt(), не трогая больше chk().

на втором проходе оператор for отдаст в тело цикла $phone , поместив ссылку на последнюю в переменную $_ .
запомнивший своё состояние флип-флоп дёрнет fmt(), что нам и требовалось.

если же, например, chk() на первом проходе решит, что совпадения с шаблоном не было, тогда chk() может вызвать оператор last и вывалиться нах из цикла for.


реализация:
Код: perl
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
sub chk (_) {

    print "Inside chk: arg=$_\n";

    /^\d+/ ? 1 : last;

}

sub fmt(_) {

    print "Inside fmt:arg=$_\n";

    s/(\d+)/$1*$1/e;
}



Итак, при вызове:
Код: perl
1.
2.
3.
4.
$string = 11;
$phone = 3;
chk ... fmt for $string, $phone;
print "Result = $phone\n";


должны увидеть:
Inside chk:arg=11
Inside fmt:arg=3
Result = 9

а при вызове:
Код: perl
1.
2.
3.
4.
$string = "эх-ма";
$phone = 3;
chk ... fmt for $string, $phone;
print "Result = $phone\n";


должны увидеть:
Inside chk:arg=эх-ма
Result = 3
...
Рейтинг: 0 / 0
Perl - подскажите по синтаксису
    #39345257
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek,

format, кстати, служебное слово. это нехорошо.
...
Рейтинг: 0 / 0
Perl - подскажите по синтаксису
    #39345267
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну на самом деле функции у меня называются иначе, я их только здесь переназвал.
А вот с ... решение выглядит интересно.
Правда мне привычнее использовать функции возвращающие значения, но и в таком виде тоже нормально.
...
Рейтинг: 0 / 0
Perl - подскажите по синтаксису
    #39345272
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну, выглядит необычно так, да,
и волнующе.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl - подскажите по синтаксису
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]