Есть массив. В каждом элементе массива забиты строки переменной длины.
Выглядят так
Тип компьютера Advanced Configuration and Power Interface (ACPI) PC
Операционная система Microsoft Windows 2000 Serverэто лог евереста для определенного компьютера.
в этих строчках есть небольшая сложность - это различное количесво пробелов между первой фразой - и между второй. а вот количество пробелов от начала строки до первой части - постоянно...
нужно выкорчевать из них вторую часть.
даже ума не приложу как это сделать=(
может кто поможет?
может так?
/\ {5}(\w+\ )+\ {3-60}(\w+\ )+
>может так?
>/\ {5}(\w+\ )+\ {3-60}(\w+\ )+или так
($shit,$good)=split(/\s{2,}/,$string);
>>может так?
>>/\ {5}(\w+\ )+\ {3-60}(\w+\ )+
>
>или так
>($shit,$good)=split(/\s{2,}/,$string);
$shit - строка на входе
$good - строка на выходе
$string - не понял совсем что это...=(
2, - то же не понял...Поясните плз чайнику!
PS /\ {5}(\w+\ )+\ {3-60}(\w+\ )+ - здесь вообще не понятно.
что к чему и зачем - облазил все инетовские справочники - ничего не нашел или просто не видел=(
>>>может так?
>>>/\ {5}(\w+\ )+\ {3-60}(\w+\ )+
>>
>>или так
>>($shit,$good)=split(/\s{2,}/,$string);
>
>
>$shit - строка на входе
>$good - строка на выходе
>$string - не понял совсем что это...=(
>2, - то же не понял...
>
>Поясните плз чайнику!
>
>PS /\ {5}(\w+\ )+\ {3-60}(\w+\ )+ - здесь вообще не понятно.
>что к чему и зачем - облазил все инетовские справочники - ничего
>не нашел или просто не видел=(Короче - не работает=(
или у меня корявые ручки...
помогите!
>>($shit,$good)=split(/\s{2,}/,$string);
>
>
>$shit - строка на входе
Это первая часть разделённой строки>$good - строка на выходе
Это втоая часть разделённой строки>$string - не понял совсем что это...=(
Это ваша строка, которую нужна разделить.>2, - то же не понял...
Читайте про регулярные выражения, доки рулят..
Делаю так
if ($stroka=~/Тип компьютера/) {($shit,$good)=split(/\s{2,}/,$stroka); print OUT $shit;}
выдает пустоту - то есть пустую строку.а если так
if ($stroka=~/Тип компьютера/) {($shit,$good)=split(/\s{2,}/,$stroka); print OUT $good;}
выдает первую часть строки... то бишь выдает слова "Тип компьютера".я понимаю что ошибка в моем ДНК =) но всё же это - не работает и исправить это я не могу...
>а если так
>if ($stroka=~/Тип компьютера/) {($shit,$good)=split(/\s{2,}/,$stroka); print OUT $good;}
>выдает первую часть строки... то бишь выдает слова "Тип компьютера".Добавьте перед этим:
$stroka =~ /^\s*//;Или, альтернативный вариант:
$stroka =~ /^\s+(.*?)\s{2,}(.*)$/;
print "$1 -> $2\n";
>>а если так
>>if ($stroka=~/Тип компьютера/) {($shit,$good)=split(/\s{2,}/,$stroka); print OUT $good;}
>>выдает первую часть строки... то бишь выдает слова "Тип компьютера".
>
>Добавьте перед этим:
>$stroka =~ /^\s*//;
>
>Или, альтернативный вариант:
>$stroka =~ /^\s+(.*?)\s{2,}(.*)$/;
>print "$1 -> $2\n";
ИМХО лучший вариант для обработки подобных данных не такой.
Сперва обработайте массив и приведите его к более правильной структуре: то есть. Берем ваш массив, и начинаем итерацию по каждому элементу,for($i=0;$i<@MASSIV;$i++) {
$MASSIV[$i]=~s/\s{2,}/|/g;# заменяем более 2 пробелов на какой-либо символ (к примеру |)
}После такой обработки, элемент будет содержать уже более "удобную" строку: типа:
Слово слово|слово слово слово|
Теперь достаточно сплитить строку по символу |, и вынуть все необходимые элементы:
for($i=0;$i<@MASSIV;$i++) {
($first,$second)=split(/|/,$MASSIV[$i]);
}ЗЫ. Непомню нужно ли экранировать |, по моему нет.
Спасибо всем большое - всё работает!
>>>а если так
>>>if ($stroka=~/Тип компьютера/) {($shit,$good)=split(/\s{2,}/,$stroka); print OUT $good;}
>>>выдает первую часть строки... то бишь выдает слова "Тип компьютера".
>>
>>Добавьте перед этим:
>>$stroka =~ /^\s*//;
>>
>>Или, альтернативный вариант:
>>$stroka =~ /^\s+(.*?)\s{2,}(.*)$/;
>>print "$1 -> $2\n";
>ИМХО лучший вариант для обработки подобных данных не такой.
>Сперва обработайте массив и приведите его к более правильной структуре: то есть.
>Берем ваш массив, и начинаем итерацию по каждому элементу,
>
>for($i=0;$i<@MASSIV;$i++) {
>
>$MASSIV[$i]=~s/\s{2,}/|/g;# заменяем более 2 пробелов на какой-либо символ (к примеру |)
>}
>
>После такой обработки, элемент будет содержать уже более "удобную" строку: типа:
>
>Слово слово|слово слово слово|
>
>Теперь достаточно сплитить строку по символу |, и вынуть все необходимые элементы:
>
>
>for($i=0;$i<@MASSIV;$i++) {
>
>($first,$second)=split(/|/,$MASSIV[$i]);
>}
>
>ЗЫ. Непомню нужно ли экранировать |, по моему нет.
Скажите, а чем $MASSIV[$i]=~s/\s{2,}/|/g с точки зрения регекспа отличается от ($first,$second)=split(/\s{2,}/,$string); ??
Мне кажется просто лишнее нагромождение кода, хотя это лишь мое мнение.
>Скажите, а чем $MASSIV[$i]=~s/\s{2,}/|/g с точки зрения регекспа отличается от ($first,$second)=split(/\s{2,}/,$string); ??
>
>Мне кажется просто лишнее нагромождение кода, хотя это лишь мое мнение.А зачем создавать неиспользуемые переменные?
Можно все свести примерно к следующему (если исходные строки в MASSIV'е):
s/^.+?\s{2,}// for @MASSIV;(если я правильно понял задачу...)
>А зачем создавать неиспользуемые переменные?
>
>Можно все свести примерно к следующему (если исходные строки в MASSIV'е):
>s/^.+?\s{2,}// for @MASSIV;
>
>(если я правильно понял задачу...)Вы правильно поняли задачу - но это-то просто и понятно...
вот следующую задачу я никак не могу осилисть -хотя она и простая.
есть строка. в этой строке в произвольном месте есть тэг <td>. после тэга идет фраза она замыкается тэгом </a>. дальше еще идет фраза.
то етсь где то посредине строки есть фраза обрамленная тэгами <td> и </a>.
нужно получить эту фразу.
как это сделать?
найти номер позиции с которой есть эта фраза не проблема, номер позиции с котрой начинается тэг </a> то же не проблема - но как выдернуть фразу?
Задачу выставленную в предыдущем вопросе в принципе решил...
думаю что коряво=(
посмотрите этот с позволения сказать кодchop($f[$m+1],$f[$m+2],$f[$m+3]);
$loc1=index(($f[$m+1].$f[$m+2].$f[$m+3]), "<TD>");
$loc2=index (($f[$m+1].$f[$m+2].$f[$m+3]),"</A>");
$hh=substr(($f[$m+1].$f[$m+2].$f[$m+3]),$loc1,$loc2+4);
print "$hh \n";
Може ткто предложит более изящное решение?
а то я как то в регулярных выражениях - пас=(
>Задачу выставленную в предыдущем вопросе в принципе решил...
>думаю что коряво=(
>посмотрите этот с позволения сказать код
>
>chop($f[$m+1],$f[$m+2],$f[$m+3]);
>
>$loc1=index(($f[$m+1].$f[$m+2].$f[$m+3]), "<TD>");
>
>$loc2=index (($f[$m+1].$f[$m+2].$f[$m+3]),"</A>");
>
>$hh=substr(($f[$m+1].$f[$m+2].$f[$m+3]),$loc1,$loc2+4);
>
>print "$hh \n";
>
Как тут любят говорить некоторые - фтопку :)
Некрасиво и не по "перловому".>Може ткто предложит более изящное решение?
>а то я как то в регулярных выражениях - пас=(
А вот это зря. СтОит потратить день на изучение регекспов и жизнь будет намного проще :)Что такое $f[$m+1].$f[$m+2].$f[$m+3]?
Получение строки, в которой искать?($hh) = join("",@f[$m+1..$m+3]) =~ m#<TD>(.+?)</A>#;
print "$hh \n";