Перейти к контенту

Язык Lua. Общие вопросы программирования


Рекомендуемые сообщения

С чего начинать и где взять.

 

Установка 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

Изменено пользователем Kirgudu
Ссылка на комментарий

Struck, чем тебе мануалы по Lua не угодили, что читаешь нечто в C языках?

Все расписано по полочкам, хотя конечно же языком тех, кто все же в общей теме.

Уж если тебе непонятно "найденное вхождение", то без технического переводчика (т.е. на язык чайников в технических текстах) тебе будет не просто ... ;-)

"найденное вхождение" - упрощенно: содержит ли строка искомый символ и соответственно сам символ и место в строке, где этот символ найден.

Твой патерн вероятно означает (хотя зависит от метода к которому применяется):

Требуется вернуть от конца строки 1 и не более символ не равный пробелу. Т.е. если в конце строки имеется один символ после и/или пробела(ов) или даже без пробелов - он и будет "найден".

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
чем тебе мануалы по Lua не угодили, что читаешь нечто в C языках?

 

А...невнимательность, действительно - нашел, почитаю. Почитал(бегло) не нашел описания значения символов(*.$) Выяснил, что ^ означает что поиск начинаем с начала строки.

 

Уж если тебе непонятно "найденное вхождение", то без технического переводчика (т.е. на язык чайников в технических текстах) тебе будет не просто ... ;-)

 

Действительно...забыл погуглить :)

 

Твой патерн вероятно означает (хотя зависит от метода к которому применяется):

 

(string.gsub(str, "^%s*(.-)%s*$", "%1"))

 

Вот мой код собственно...и из паттерна мне понятно только ^%s - эта часть.(Начинаем поиск с начала строки)

Изменено пользователем Struck
Ссылка на комментарий
^%s*(.-)%s*$

^ Ищем от начала строки.

%s* Пропускаем пробельный символ один и более раз.

(.-) Захватываем первый встретившийся любой символ один и более раз.

%s* Пропускаем пробельный символ один и более раз.

$ Конец.

 

Непонятно как оно вообще работает.

По мне, так паттерн бредовый.

 

МЯСО!
Ссылка на комментарий

Мда-а-а, вопросы ты тоже задавать пока не научился. Как ты думаешь, будет ли кто-то отвечать на подобное: "Я вот тут, не зная буковок, написчал чАвото, не подскажете каков смысл мною написанного?" :crazy:

1. Задавать вопрос нужно по сути, т.е. указывать цель, а не давать кусок своего, зачастую неверного, предположения/решения и прося раз'яснить то, чего порою и невозможно раз'яснить.

2. Раз нашел мануал - почитай его не бегло! Все там найдешь.

3. "Волшебные символы" порой имееют не одно значение, которые зависят и от контекста и от места ... Символ '^' может означать и "с начала строки" и "не", т.е. указываемые в маске символу НЕ должне встречаться, ну и т.п.

4. "Твой" код - опять кастрирован, и как минимум должен иметь начало, типа: my_string = string.gsub(str, "^%s*(.-)%s*$", "%1"), т.е. идет итерация по заданной строке (str) и результат замены возвращается в my_string.

 

Добавлено через 4 мин.:

Кактус_523

один и более любой символ пишут так: '.+'

%s* - означает ни одного или более (чем один), т.е. пробелов может и не быть вовсе.

 

и согласен, патерн, да еще для gsub, бредовый. ;-)

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Запамятовал.

Я их и не использую практически.

Нужды не возникало.

 

По поводу покурить вот

Составлял в виде памятки для себя на основе одной хорошей статейки с теперь уже мертвого сайта.

МЯСО!
Ссылка на комментарий

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

 

Ссылка на комментарий
а какие паттерны для него НЕбредовые?

Написанные с умом.

 

P.S.: Вообще не мешало бы сформулировать свой вопрос.

Ну и описать как должна работать функция.

А то бывает написано одно, а автор хотел совсем другое.

Изменено пользователем Кактус_523
МЯСО!
Ссылка на комментарий

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) в цикле - вызывает улыбку и недоумение.

 

В общем толковать подобное бессмысленно, хотя и работает кое-как, но зачем так сделано - только автор сего кода может растолковать.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
Что означает сей pattern?
 "^%s*(.-)%s*$"

Ответы конечно правильные по результату.

Я хотел бы хотел пояснить некоторые особенности.

Дело в том, что символ звёздочки "*" вообще находится на особом счету, и работает он по-особому.

Задав, ну хотя бы такой паттерн - "^%s*", строка сначала считывается ЦЕЛИКОМ!, а затем от конца строки начинается поиск совпадений (его ещё называют "прожорливым").

И не важно что вначале стоит символ "циркумфлекс". Сначала строки поиск всё равно производится не будет. Только от конца.

Изменено пользователем Gun12
Ссылка на комментарий

Дам все же иную трактовку нашим ответам и принесу извинения команде АМК, написавшим исходную связку функций, которую кто-как курочит и корежит:

Исходная связка 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)

...

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Доброго времени суток.

Возник новый вопрос.

Возможно ли, время, представленное в секундах (как пример os.time), преобразовать в формат: год, месяц, день, час, минута.

Собственно сама задача, из реестра получаю дату установки ОС в секундах и надо привести к человеческой форме восприятия.

Есть ли какой-нибудь штатный способ перевода или придется реализовывать с помощью более сложного кода?

userbar368.png

Ссылка на комментарий

Тогда я непонял вопроса.

Смысл только сейчас дошел.

 

Насколько я помню штатного метода нет.

А самопальный будет не такой уж сложный, сколько мозговыносящий.

Найти количество дней, минут, секунд и уже это переводить в года и месяцы....

На википедии кажется была статейка.

Изменено пользователем Кактус_523
МЯСО!
Ссылка на комментарий

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

 

Ссылка на комментарий

Здравствуйте, товарищи!

У меня вопрос в тему.

Есть дата в текстовом формате.

Есть ли стандартные функции для перевода в секунды c 1970 года?

Уж очень не хочется считать високосные года...

МЯСО!
Ссылка на комментарий

Кактус_523,

os.difftime (в мануале слабо было поискать? У меня заняло меньше, чем сюда отвечал :ny_angry: )

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

Вот незадача.

Для os.difftime требуется количество секунд.

А у меня всего лишь текст.

Наверное ты не так понял слово текст.

Вот "07-04-12_16-12-17".

 

Парсить и считать лень.

Вот и спросил.

Может в стандарте есть чего...

Изменено пользователем Кактус_523
МЯСО!
Ссылка на комментарий

Кактус_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

 

Ссылка на комментарий

Хм.

os.time() заработала.

В предыдущий раз выдавала nil.

Скорей всего я ей или строки передавал, или еще какая мистика происходила.

МЯСО!
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...