Автор Тема: perl регулярен израз  (Прочетена 2451 пъти)

qwerty11

  • Напреднали
  • *****
  • Публикации: 23
    • Профил
perl регулярен израз
« -: 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}
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: perl регулярен израз
« Отговор #1 -: 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.
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

qwerty11

  • Напреднали
  • *****
  • Публикации: 23
    • Профил
Re: perl регулярен израз
« Отговор #2 -: 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.

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

Demayl

  • Напреднали
  • *****
  • Публикации: 104
  • Distribution: XUbuntu,FreeBSD
  • Window Manager: Xfce
    • Профил
    • WWW
Re: perl регулярен израз
« Отговор #3 -: 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;
Активен


Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Perl
Общ форум
x11r6 5 3404 Последна публикация Aug 09, 2003, 10:03
от x11r6
Perl
Общ форум
Йордан 3 2851 Последна публикация Nov 13, 2003, 16:14
от Йордан
Gtk-Perl
Хардуерни и софтуерни проблеми
apogza 0 1773 Последна публикация Jan 24, 2004, 12:52
от apogza
Ползва ли се Perl в България и за какво?
Общ форум
berov 63 18649 Последна публикация Jan 31, 2005, 11:17
от toxigen
Четене от Серийни портове с Perl
Общ форум
berov 2 2586 Последна публикация Jun 15, 2004, 18:17
от berov