Разбить строку на несколько разделов по индексу perl - PullRequest
1 голос
/ 26 сентября 2011

У меня есть вывод команды diskpart:

Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
----------  ---  -----------  -----  ----------  -------  ---------  --------
Volume 0     D                       DVD-ROM         0 B  No Media
Volume 1     C   OSDisk       NTFS   Partition    232 GB  Healthy    Boot
Volume 2         BDEDrive     NTFS   Partition    300 MB  Healthy    System

Я хочу записать каждый из них в отдельную переменную, поэтому первым делом я хотел сделать что-то вроде ($ volume, $ ltr, ..., $ info) = $ line = ~ ((\ w + \ s \ d +) \ s + ([AZ])? ...

Проблема, с которой я столкнулся, заключается в том, что нет ничего уникального между Label, FS и Type, поэтому, если я использую (\w+)\s+ в каждом из этих столбцов, есть вероятность, что Label не существует, но FS существует, и, таким образом, файловая система неправильно читает в $ label.

Я не слишком уверен, смогу ли я сделать это с помощью регулярных выражений, но я открыт для предложений! Вместо этого я собирался пойти в новом направлении и просто разделить строку на основе индексов, начинающихся с - и заканчивающихся - . Если я вытащил все эти индексы, какой лучший способ разбить эту строку на соответствующие им подстроки Perl?

Я посмотрел на substr и попытался передать ему несколько индексов, например ($a,$b,$c) = substr('abcd', 1,2,3);, но это просто привело к тому, что $ a было разделено между 2,3

Есть ли какое-нибудь элегантное решение для этого, кроме простого разбиения всего на одну строку за раз?

Ответы [ 2 ]

5 голосов
/ 28 сентября 2011

Вместо использования (не очень удобного) регулярного выражения гораздо проще использовать распаковку:

my @l = unpack('A12 A5 A13 A7 A12 A9 A11 A9', $_);

Вам все еще нужно выбросить вторую строку, но вам не нужно заботиться о том, как выглядят ваши данные.

2 голосов
/ 26 сентября 2011

Как насчет:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dump qw(dump);


while(<DATA>) {
    chomp;
    my @l = /^(\w*\s\d*)\s+(\w|\s)\s+(\w+|\s+)\s+(\w+|\s+)\s+([\w-]+|\s+)\s+(\d+\s\w{1,2})\s+?([\w\s]+)\s+?([\w\s]+)$/;
    dump(@l) if @l;
}


__DATA__
Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
----------  ---  -----------  -----  ----------  -------  ---------  --------
Volume 0     D                       DVD-ROM         0 B  No Media          
Volume 1     C   OSDisk       NTFS   Partition    232 GB  Healthy    Boot
Volume 2         BDEDrive     NTFS   Partition    300 MB  Healthy    System

выход:

(
  "Volume 0",
  "D",
  " ",
  " ",
  "DVD-ROM",
  "0 B",
  " No Media        ",
  " ",
)

(
  "Volume 1",
  "C",
  "OSDisk",
  "NTFS",
  "Partition",
  "232 GB",
  " Healthy   ",
  "Boot",
)

(
  "Volume 2",
  " ",
  "BDEDrive",
  "NTFS",
  "Partition",
  "300 MB",
  " Healthy   ",
  "System",
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...