Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: qwerty11 в Feb 09, 2012, 19:35



Титла: perl регулярен израз
Публикувано от: qwerty11 в Feb 09, 2012, 19:35
Здравейте,
Скрипта искам да го направя да работи със регулярен израз.
имам текстов файл със цени, например

грозде     1
гроздова ракия  12
сливи     0.5
сливова ракия    10

целта ми е след като отворя файла и започна да го чета ред по ред, да създам масив от два елемента( за артикула и цената). Затруднява ме името на артикула което е съставено от две думи, например "гроздова ракия".
Написах код който е удобен и работи

#!/usr/bin/perl

open PRICE, "price.txt" or die $!;

while (<PRICE>){
@array = split(' ',$_);
$priceplant=pop(@array);
$plant = join(' ',@array);
print "$plant sas cena $priceplant\n";
$hashprice{$plant} = $priceplant;

}
print "TEST abcd cost $hashprice{abcd}\n";
close PRICE;

ДРАЗНИ МЕ че не можах да измисля регулярния израз за отделяне само на Артикула, имам в предвид нещо подобно 
if =~ /(\w+\s\w+)|(\w+\s)/ {print $1 $2}


Титла: Re: perl регулярен израз
Публикувано от: b2l в Feb 09, 2012, 19:46
Цитат
The GNU extensions not only make both flavors identical. They also adds some new syntax and several brand new features. The shorthand classes \w, \W, \s and \S can be used instead of [[:alnum:]_], [^[:alnum:]_], [[:space:]] and [^[:space:]]. You can use these directly in the regex, but not inside bracket expressions. A backslash inside a bracket expression is always a literal.


Титла: Re: perl регулярен израз
Публикувано от: qwerty11 в Feb 09, 2012, 19:54
Цитат
The GNU extensions not only make both flavors identical. They also adds some new syntax and several brand new features. The shorthand classes \w, \W, \s and \S can be used instead of [[:alnum:]_], [^[:alnum:]_], [[:space:]] and [^[:space:]]. You can use these directly in the regex, but not inside bracket expressions. A backslash inside a bracket expression is always a literal.

Стана,
Благодаря много за цитата и помощта, дано бъде полезно и за другите потребители.


Титла: Re: perl регулярен израз
Публикувано от: Demayl в Feb 09, 2012, 22:52
#!/usr/bin/perl

open PRICE, "price.txt" or die $!;

while (<PRICE>){
my ( $item, $cena ) = ( $_ =~ /^(.*?)(\d+[\.,]?\d*)$/ ) ;
$hashprice{$item} = $cena;

## Ако искаш да можеш да улавяш кирилицата с \w пробвай това
# use Encode
# $encoded_string = decode("utf8",$_);
# my ( $item, $cena ) = ( $encoded_string =~ /^(.*?)(\d+[\.,]?\d*)$/ ) ;
}
print "TEST abcd cost $hashprice{abcd}\n";
close PRICE;