LINUX.ORG.RU

perl: 2 вопроса


0

0

Вопрос первый, про регэксп.
есть переменная вида $file = "06-07";
почему $file =~ /(d{2})/g загоняет в $1 06, но почему-то не хочет в $2 загонять 07. Конечно можно сделать $file =~ /(d{2})-(d{2})/, но имхо это не красиво.
И вопрос второй:
подскажите как лучше работать с бинарными файлами? брать готовые .pm(какие?) или лучше разбирать ручками, по байтно?
Тогда как работать с 2х-3х байтными числами с "Big Endian" и bcd?

\d разумеется имел ввиду.

brumal
() автор топика

> Вопрос первый, про регэксп.
> есть переменная вида $file = "06-07";
> почему $file =~ /(d{2})/g загоняет в $1 06, но почему-то не хочет в
> $2 загонять 07.
>

Ну... делает ровно то, что ты от него просишь, налицо непонимание
того, как работает matching operator. Читать perldoc perlop, там
есть пример (ну и вообще документацию).

В данном конкретном случае:
$file = "06-07";
print "$1\n" while $file =~ /(\d{2})/g;

HTH

Onanim
()
Ответ на: комментарий от brumal

> хм, почему-то считал, что /g заставляет его "замечать" всё в строке подходящее под шаблон :(

Ну он именно это и делает - только не таким образом, как ты это
себе представлял ;-)

Прочитай насчет того, что возвращает m//g в скалярном и списковом
контекстах.
Вот эта конструкция наверное максимально близка к тому, что ты хотел:

my ($x, $y) = $file =~ /(\d{2})/g;
print "$x $y\n";

или просто
@numbers = $file =~ /(\d{2})/g;

HTH

Onanim
()

> подскажите как лучше работать с бинарными файлами?

Если "руками" то perldoc -f pack и perldoc -f unpack
Там есть big-endian и little-endian.

Насчет BCD и вообще модулей - http://search.cpan.org

HTH

Onanim
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.