Dennis_Chikin 3 658 Опубликовано 4 Января 2015 Поделиться Опубликовано 4 Января 2015 (изменено) С чего начинать и где взять. Установка Lua:http://www.amk-team.ru/forum/index.php?showtopic=11584&p=629106 Руководство «Программирование на языке Lua», третье издание:http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905308 Изменено 2 Марта 2015 пользователем Kirgudu Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Artos 99 Опубликовано 9 Июня 2012 Поделиться Опубликовано 9 Июня 2012 (изменено) Struck, чем тебе мануалы по Lua не угодили, что читаешь нечто в C языках? Все расписано по полочкам, хотя конечно же языком тех, кто все же в общей теме. Уж если тебе непонятно "найденное вхождение", то без технического переводчика (т.е. на язык чайников в технических текстах) тебе будет не просто ... ;-) "найденное вхождение" - упрощенно: содержит ли строка искомый символ и соответственно сам символ и место в строке, где этот символ найден. Твой патерн вероятно означает (хотя зависит от метода к которому применяется): Требуется вернуть от конца строки 1 и не более символ не равный пробелу. Т.е. если в конце строки имеется один символ после и/или пробела(ов) или даже без пробелов - он и будет "найден". Изменено 9 Июня 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Struck 61 Опубликовано 9 Июня 2012 Поделиться Опубликовано 9 Июня 2012 (изменено) чем тебе мануалы по Lua не угодили, что читаешь нечто в C языках? А...невнимательность, действительно - нашел, почитаю. Почитал(бегло) не нашел описания значения символов(*.$) Выяснил, что ^ означает что поиск начинаем с начала строки. Уж если тебе непонятно "найденное вхождение", то без технического переводчика (т.е. на язык чайников в технических текстах) тебе будет не просто ... ;-) Действительно...забыл погуглить Твой патерн вероятно означает (хотя зависит от метода к которому применяется): (string.gsub(str, "^%s*(.-)%s*$", "%1")) Вот мой код собственно...и из паттерна мне понятно только ^%s - эта часть.(Начинаем поиск с начала строки) Изменено 9 Июня 2012 пользователем Struck Ссылка на комментарий
Кактус_523 1 Опубликовано 9 Июня 2012 Поделиться Опубликовано 9 Июня 2012 ^%s*(.-)%s*$ ^ Ищем от начала строки. %s* Пропускаем пробельный символ один и более раз. (.-) Захватываем первый встретившийся любой символ один и более раз. %s* Пропускаем пробельный символ один и более раз. $ Конец. Непонятно как оно вообще работает. По мне, так паттерн бредовый. МЯСО! Ссылка на комментарий
Artos 99 Опубликовано 9 Июня 2012 Поделиться Опубликовано 9 Июня 2012 (изменено) Мда-а-а, вопросы ты тоже задавать пока не научился. Как ты думаешь, будет ли кто-то отвечать на подобное: "Я вот тут, не зная буковок, написчал чАвото, не подскажете каков смысл мною написанного?" 1. Задавать вопрос нужно по сути, т.е. указывать цель, а не давать кусок своего, зачастую неверного, предположения/решения и прося раз'яснить то, чего порою и невозможно раз'яснить. 2. Раз нашел мануал - почитай его не бегло! Все там найдешь. 3. "Волшебные символы" порой имееют не одно значение, которые зависят и от контекста и от места ... Символ '^' может означать и "с начала строки" и "не", т.е. указываемые в маске символу НЕ должне встречаться, ну и т.п. 4. "Твой" код - опять кастрирован, и как минимум должен иметь начало, типа: my_string = string.gsub(str, "^%s*(.-)%s*$", "%1"), т.е. идет итерация по заданной строке (str) и результат замены возвращается в my_string. Добавлено через 4 мин.: Кактус_523 один и более любой символ пишут так: '.+' %s* - означает ни одного или более (чем один), т.е. пробелов может и не быть вовсе. и согласен, патерн, да еще для gsub, бредовый. ;-) Изменено 9 Июня 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Кактус_523 1 Опубликовано 9 Июня 2012 Поделиться Опубликовано 9 Июня 2012 Запамятовал. Я их и не использую практически. Нужды не возникало. По поводу покурить вот Составлял в виде памятки для себя на основе одной хорошей статейки с теперь уже мертвого сайта. МЯСО! Ссылка на комментарий
Struck 61 Опубликовано 10 Июня 2012 Поделиться Опубликовано 10 Июня 2012 Artos, ответил бы...да флуд разжигать не хочется, код писал кстати не я, мне просто дали функцию и я хотел бы разобраться в ней. да еще для gsub Почему "да еще"...а какие паттерны для него НЕбредовые? function trim(str) return (string.gsub(str, "^%s*(.-)%s*$", "%1")) end function explode(str, sep) local pos, t = 1, {} if #sep == 0 or #str == 0 then return end for s, e in function() return string.find(str, sep, pos) end do table.insert(t, trim(string.sub(str, pos, s-1))) pos = e+1 end table.insert(t, trim(string.sub(str, pos))) return t end Ссылка на комментарий
Кактус_523 1 Опубликовано 10 Июня 2012 Поделиться Опубликовано 10 Июня 2012 (изменено) а какие паттерны для него НЕбредовые? Написанные с умом. P.S.: Вообще не мешало бы сформулировать свой вопрос. Ну и описать как должна работать функция. А то бывает написано одно, а автор хотел совсем другое. Изменено 10 Июня 2012 пользователем Кактус_523 МЯСО! Ссылка на комментарий
Artos 99 Опубликовано 10 Июня 2012 Поделиться Опубликовано 10 Июня 2012 (изменено) Struck, флудить мы все горазды, а вот по сути спрашивать иль отвечать - сей факт становится все реже и реже ... ;-( 1. Если тебе захотелось разобраться, то почему ты считаешь, что предварительное чтение материалов по теме - не обязательно, и можно напрямую просить растолковать то, что расписано специально для тех, кто хочет разобраться? 2. Твоей функции уже пять лет как исполнилолось и взята она (trim) из AMK-мода. Провда тот кто тебе ее дал заодно и тамошнюю функцию explode привел скорее также к бредовой форме, чем к улучшению. Бредовость патерна именно для gsub в том, что этот метод по определению обрабатывет строку от начала и до конца (читаем мануал!), т.о. бессмысленно задавать символы "от начала" и "до конца". Уже давно имеется на форумах (и этом тоже) и в модах нормальная замена: function trim(str) if str and str ~= '' then return str:match('^%s*(.*%S)') or '' --/> end return '' --/> end Возврат пустой строки избавляет от фатальных ошибок в случае, если строка содержит одни пробелы, что "дорабатанная" explode пропустит на ура, т.к. при наличии только пробелов условие #str == 0 как раз не отсекает подобные строки ... Отсекать нужно именно пустые строки или имеющие только пробелы, ну да это уже по-контексту стоящей задачи делается. Ну а "бредовость" в нынешнем виде функции explode в том, что достаточно бессмысленная связка условий: if #sep == 0 or #str == 0 then return end почти ничего не отсекает, кроме забытых иль явно ошибочных входных аргуметтов, а вот то, что отсекая - ничего(!) не возвращает, скорее привнесет бОльше фатальных ошибок. Исходно, explode должна возвращать таблицу, пустую или заполненну, а не nil (хотя конечно и это зависит от контекста). Ну и нашпигование внутри функцией string.find (которая уже по выходу игры устарела в Lua) в цикле - вызывает улыбку и недоумение. В общем толковать подобное бессмысленно, хотя и работает кое-как, но зачем так сделано - только автор сего кода может растолковать. Изменено 10 Июня 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Nazgool 250 Опубликовано 10 Июня 2012 Поделиться Опубликовано 10 Июня 2012 (изменено) Что означает сей pattern? "^%s*(.-)%s*$" Ответы конечно правильные по результату. Я хотел бы хотел пояснить некоторые особенности. Дело в том, что символ звёздочки "*" вообще находится на особом счету, и работает он по-особому. Задав, ну хотя бы такой паттерн - "^%s*", строка сначала считывается ЦЕЛИКОМ!, а затем от конца строки начинается поиск совпадений (его ещё называют "прожорливым"). И не важно что вначале стоит символ "циркумфлекс". Сначала строки поиск всё равно производится не будет. Только от конца. Изменено 10 Июня 2012 пользователем Gun12 Ссылка на комментарий
Artos 99 Опубликовано 10 Июня 2012 Поделиться Опубликовано 10 Июня 2012 (изменено) Дам все же иную трактовку нашим ответам и принесу извинения команде АМК, написавшим исходную связку функций, которую кто-как курочит и корежит: Исходная связка trim + explode задумывалась достаточно многофункциональной и имела на входе помино собственно разделяемой строки и разделителя (обычно по-запятой ',') еще и флаг clear, т.е. чистить от пробелов или нет. К сожалению, тяга к упрощениям в названиях и трактовках превратила trim в синоним "чистка от пробелов". Однако, назначение вышеупомянутого патерна и результат на выходе - очистка от начальных и конечных пробелов, т.е. очистка строки/линии, а не слова. Вот тут как раз и играют важную роль '^' и '$' уточняющие, что следует чистить ТОЛЬКО от начала и от конца. Все привыкли, что в задаваемой строке для разделения идет типа: ab, cd, ef, ... что естественно и приводит к выводу о "бредовости" применения начального и конечного спец.символов, однако в том же АМК-моде (например, в интерактивных.новостях) для разделения использовались строки типа: a b, c d e, f g, ... т.е. требовалось делить именно только по разделителю и убирать начальные и завершающие пробелы, оставляя связки слов (темный сталкер, зеленый новичек, ...) именно неоазделенными. Исходная trim как раз выполняла задачу как trim_line, а не как trim_word, хотя на порядок проигрывает в производительности указанному выше эквиваленту. А вообще, без указания задачи для чего служит патерн, довольно глупо спрашивать/критиковать иль предлагать, вариаций немало: string.trim(str) -- обрезка строки (line) string.trim_l(str) -- обрезка строки слева (left) string.trim_r(str) -- обрезка строки справа (right) string.trim_w(str) -- обрезка строки по первому слову (word) ... Изменено 10 Июня 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Callisto 2 Опубликовано 22 Июня 2012 Поделиться Опубликовано 22 Июня 2012 Доброго времени суток. Возник новый вопрос. Возможно ли, время, представленное в секундах (как пример os.time), преобразовать в формат: год, месяц, день, час, минута. Собственно сама задача, из реестра получаю дату установки ОС в секундах и надо привести к человеческой форме восприятия. Есть ли какой-нибудь штатный способ перевода или придется реализовывать с помощью более сложного кода? Ссылка на комментарий
Кактус_523 1 Опубликовано 22 Июня 2012 Поделиться Опубликовано 22 Июня 2012 Задать шаблон. os.date("%Y.%m.%d") К примеру опять же. МЯСО! Ссылка на комментарий
Callisto 2 Опубликовано 22 Июня 2012 Поделиться Опубликовано 22 Июня 2012 Кактус_523, А причем тут os.date? У меня есть число и его необходимо преобразовать в дату. Или может я чего не понимаю? Ссылка на комментарий
Кактус_523 1 Опубликовано 22 Июня 2012 Поделиться Опубликовано 22 Июня 2012 (изменено) Тогда я непонял вопроса. Смысл только сейчас дошел. Насколько я помню штатного метода нет. А самопальный будет не такой уж сложный, сколько мозговыносящий. Найти количество дней, минут, секунд и уже это переводить в года и месяцы.... На википедии кажется была статейка. Изменено 22 Июня 2012 пользователем Кактус_523 МЯСО! Ссылка на комментарий
Nazgool 250 Опубликовано 24 Июня 2012 Поделиться Опубликовано 24 Июня 2012 Callisto os.date и есть штатный метод lua. Так что Кактус_523 сказал верно. Вызывай os.date(формат, число секунд) "число секунд" и есть то число, которое преобразовывается в дату. Также ты можешь получить таблицу со всеми данными времени. Напр. t = (os.date("*t", 1500000000)) for k,v in pairs(t) do print(k,v) end Выйдет таблица вида : hour 5 min 40 wday 6 day 14 month 7 year 2017 sec 0 yday 195 isdst true Ссылка на комментарий
Кактус_523 1 Опубликовано 11 Июля 2012 Поделиться Опубликовано 11 Июля 2012 Здравствуйте, товарищи! У меня вопрос в тему. Есть дата в текстовом формате. Есть ли стандартные функции для перевода в секунды c 1970 года? Уж очень не хочется считать високосные года... МЯСО! Ссылка на комментарий
Malandrinus 615 Опубликовано 11 Июля 2012 Автор Поделиться Опубликовано 11 Июля 2012 Кактус_523, os.difftime (в мануале слабо было поискать? У меня заняло меньше, чем сюда отвечал :ny_angry: ) Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Кактус_523 1 Опубликовано 11 Июля 2012 Поделиться Опубликовано 11 Июля 2012 (изменено) Вот незадача. Для os.difftime требуется количество секунд. А у меня всего лишь текст. Наверное ты не так понял слово текст. Вот "07-04-12_16-12-17". Парсить и считать лень. Вот и спросил. Может в стандарте есть чего... Изменено 11 Июля 2012 пользователем Кактус_523 МЯСО! Ссылка на комментарий
Malandrinus 615 Опубликовано 11 Июля 2012 Автор Поделиться Опубликовано 11 Июля 2012 Кактус_523, а, так ты хочешь, чтобы тебе одному известно как заданную строку за тебя кто-то автоматом распарсил? =) Нет, парсить таки придётся. А дальше, чтобы получить нужное время, используй os.time, которая выдаёт не "количество секунд", как ты выше заявил, а "число, смысл которого зависит от платформы". Если это винда, то это и в самом деле количество секунд с какого-то там года, возможно уже прямо то число, которое тебе надо. Однако в общем случае для вычисления числа секунд с нужного момента надо использовать os.difftime(t2, t1). Где t1,t2 - это времена, которые можно собрать из компонент (год, месяц и т.д.) функцией os.time. Ещё раз, аргументы difftime - это число во внутреннем формате Lua, а результат - строго секунды. Может в стандарте есть чего... Откуда такие сомнения? Одна страница текста всего. Справочное руководство по языку Lua - Функции операционной системы P.S.: Кстати, проверил, что именно выдаёт os.time() (т.е. текущее время без аргументов). В самом деле у меня (под виндой) выдаёт время в секундах от момента начала 1970 г. - 5 часов, что очевидно соответствует моему часовому поясу. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Кактус_523 1 Опубликовано 12 Июля 2012 Поделиться Опубликовано 12 Июля 2012 Хм. os.time() заработала. В предыдущий раз выдавала nil. Скорей всего я ей или строки передавал, или еще какая мистика происходила. МЯСО! Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти