ошибки в macro-плагине

BugTraq: обнаруженные ошибки и обсуждение их устранения.

Модератор: 4epT

Аватара пользователя
4epT
macro-маньячина
Сообщения: 2792
Зарегистрирован: Чт дек 21, 2006 1:23 pm
Сервер RO:: 4game
Discord: ya4ept#8494
Контактная информация:

ошибки в macro-плагине

Сообщение 4epT »

$.lastpm криво работает с именами с пробелами (есть альтернативное решение)
Быстро и качественно напишу конфиг (макрос)! Стучи!
¤ Свежий бот ¤ Config checker ¤ Manual ¤
Изображение
Изображение
manticora
Грамотный
Сообщения: 436
Зарегистрирован: Ср авг 29, 2007 12:45 pm

Re: ошибки в macro-плагине

Сообщение manticora »

В процессе написания [share] По пути Ведра. Макро на все профы., столкнулся с желанием писать в макросах так "@arg("aa bb cc",$n)".

Приветствую.
Надо было мне использовать в макросе команду @arg.

Код: Выделить всё

@arg ("<argument>", <n>)
возвращает <n>ый текстовой <параметр>


Так вот, был крайне удивлен, что <n> может быть только числом, но не переменной. Вот пример:

Код: Выделить всё

	$s = aa bb cc dd
	log @arg( "$s", 2 ) 
	$n = 2
	log @arg("$s",$n)
В первом случае мы увидим желаемое слово "bb", а во втором случае увидим "@arg("$s",$n)". Т.е. во втором случае макро-плагин даже не признал @arg за свою команду.

Хочу переменные во втором аргументе @arg!

Патчим (\openkore_ready\plugins\Macro\Parser.pm), функция "sub parseKw"
Было:

Код: Выделить всё

	if ($pair[0] eq 'arg') {
		return $_[0] =~ /\@(arg)\s*\(\s*(".*?",\s*\d+)\s*\)/
	}
\d+ - вот это у нас виновато, что в обработку попадают команды @arg только с числом во втором аргументе.

Стало:

Код: Выделить всё

	if ($pair[0] eq 'arg') {
		return $_[0] =~ /\@(arg)\s*\(\s*(".*?",\s*(\d+|\$\.?[a-z][a-z\d]*))\s*\)/
	}
(\d+|\$\.?[a-z][a-z\d]*) - теперь у нас есть выбор. Или число, или какая-то переменная.

Дальше макро-плагин все сделает сам.

Кстати, разделителями слов в этой команде считаются: " ,.:;'"!?" (пробел, запятая, точка, двоеточие, точка с запятой, одинарная кавычка, двойная кавычка, восклицательный знак, вопросительный знак), а также пары символов "\r" и "\n".

Например:

Код: Выделить всё

macro hh {
	$s = aa bb, cc., dd::ee;ff'gg""h!ii?
	$n = 1
	log Строка: $s
	log Разделителями слов считаются символы: " ,.:;'"!?", а также спец символы "\r" и "\n"  
	while ($n <= 9) as loop
		log Слово номер $n: @arg("$s",$n)
		$n++
	end loop
}
Вот что нам выдаст консоль:

Код: Выделить всё

macro hh
[macro][log] Строка: aa bb, cc., dd::ee;ff'gg""h!ii?
[macro][log] Разделителями слов считаются символы: " ,.:;'"!?", а также спец символы "\r" и "\n"
[macro][log] Слово номер 1: aa
[macro][log] Слово номер 2: bb
[macro][log] Слово номер 3: cc
[macro][log] Слово номер 4: dd
[macro][log] Слово номер 5: ee
[macro][log] Слово номер 6: ff
[macro][log] Слово номер 7: gg
[macro][log] Слово номер 8: h
[macro][log] Слово номер 9: ii
# Гурнин: Неплохо! Пришло время научить вас умению 'Скидка', но мы займемся этим позже.
русская вики по OpenKore, редактор макросов с подсветкой и справкой по Ctrl+F1
openkore.collectskin.com - всегда свежая svn-версия OpenKore!
Видео-гайд по установке и настройке OpenKore
smitovl
Новичок
Сообщения: 2
Зарегистрирован: Чт ноя 27, 2008 9:20 am

Re: ошибки в macro-плагине

Сообщение smitovl »

+ 5 автору последнего поста очень спасло жизнь но всё равно осталось некоторая проблема (( как убрать из этих разделителей пробел? Заранее спасибо
manticora
Грамотный
Сообщения: 436
Зарегистрирован: Ср авг 29, 2007 12:45 pm

Re: ошибки в macro-плагине

Сообщение manticora »

Приветствую.
smitovl, не знаю, зачем может понадобится удалять пробел из разделителя слов в @arg, но делается это так.
(openkore_ready/Plugins/Macro/Utilities.pm)

Код: Выделить всё

# gets word from message
sub getWord {
	my ($message, $wordno) = $_[0] =~ /^"(.*?)",\s?(\d+)$/s;
	my @words = split(/[ ,.:;\"\'!?\r\n]/, $message);
	my $no = 1;
	foreach (@words) {
		next if /^$/;
		return $_ if $no == $wordno;
		$no++
	}
	return ""
}
Вот в этой строчке между /[ и ]/ перечислены разделители. Удали пробел.

Код: Выделить всё

	my @words = split(/[ ,.:;\"\'!?\r\n]/, $message);
# Гурнин: Неплохо! Пришло время научить вас умению 'Скидка', но мы займемся этим позже.
русская вики по OpenKore, редактор макросов с подсветкой и справкой по Ctrl+F1
openkore.collectskin.com - всегда свежая svn-версия OpenKore!
Видео-гайд по установке и настройке OpenKore
Ответить