Я пытаюсь написать скрипт Perl, который будет анализировать вывод команды stcmd.exe (клиента командной строки StarTeam). Я получаю историю для каждого файла в представлении и вывод выглядит примерно так:Parsing Результат командной строки командной строки StarTeam
Folder: The View Name (working dir: C:\Projects\dir) History for: main.h Description: Some files Locked by: Status: Current ---------------------------- Revision: 1 View: The View Name Branch Revision: 1.0 Author: John Smith Date: 3/22/08 11:16:16 AM CST Main header ============================================================================= History for: main.c Description: Some files Locked by: Status: Current ---------------------------- Revision: 2 View: The View Name Branch Revision: 1.1 Author: Jane Doe Date: 3/22/08 1:55:55 PM CST Made an update. ---------------------------- Revision: 1 View: The View Name Branch Revision: 1.0 Author: John Smith Date: 3/22/08 11:16:16 AM CST Initial revision =============================================================================
Обратите внимание, что резюме редакции может содержать символы перевода строки и могут быть пустыми (в этом случае нет никакой линии для него вообще).
Я хочу получить имя файла и для каждой ревизии имя автора (первая и последняя), дата и сводка изменений. Я хотел бы разместить эту информацию в структуре данных, где я могу сортировать изменения по дате и комбинировать изменения, если совпадают дата, автор и резюме. (Я думаю, что я могу понять эту часть, если кто-то может помочь мне с разбором.) Я не большим с регулярными выражениями или Perl, но вот что я пытаюсь работать с прямо сейчас:
# $hist contains the stcmd output in the format above
while($hist =~ /History for: (?<filename>.)/s)
{
# Record filename somewhere with $+{filename}
while($hist =~ /^Revision: (?<file_rev>\S+) View: (?<view_name>.+) Branch Revision: (?<branch_rev>\S+).\nAuthor: (?<author>.*) Date: (?<date>.*) \w+\r\n(?<summary>.*)/)
{
# Extract things with $+{author}, $+{date}, $+{summary}
}
}
Однако это не работает. Насколько я знаю, я могу приблизиться к этому совершенно неправильно. Может ли кто-нибудь указать мне в правильном направлении?
Мне нравится этот ответ - очень гладкий. Но файл должен обрабатывать 1 или более ревизий (см. Main.c в образцах данных OP). Возможно, существует способ сохранить общий подход, но используйте одно регулярное выражение для захвата атрибутов файла (описание, заблокированное по статусу), а затем используйте другое регулярное выражение в скалярном контексте 'm // g' для создания списка ревизий для этого файла ... Просто мысль. – FMc
@FM фиксированный код для обработки нескольких версий. –
Очень чистое решение, üstad Sinan - Я выкапывал свою добычу, когда вы были отправлены. Не следует начинать сценарий с: use v5.010, так как именованные записи недоступны в старых версиях Perl. –