Зачётные задачки

[ Perl ]

26 Jun 2012

Несколько задачек с зачёта

Строка с дефисами

use re 'eval';
$_=<>;
/
***
/gx;

Сама задачка: Написать регвыр который будет выцеплять из строки все слова внутри которых есть дефис и выведет их, причем если одно и то же слово повторяется дважды то вывести его только один раз

Например, вводится строчка:

qqq-qq eee-ee- 4353sfdg-gsd-fdg- qw-dfg --- qw-dfg - fg-gf -fg

Выведет:

qqq-qq
eee-ee
sfdg-gsd-fdg
qw-dfg
fg-gf

А если таких слов нет вывести “No -“

Весь код писать вместо ***

Обычная версия

use re 'eval';
 $_=<>;
 /(?:
 (([A-z]+-)+[A-z]+)(?{$h{$1}=1})
 |.
 )*
 (?{ $,="\n"; if (keys %h) {print keys (%h);} else {print "No -"}})
 /gx;
 <>

Укороченная версия

use re 'eval';
 $_ = <>;
 /
 ((([A-z]+-)+[A-z]+)(?{$h{$2}++||print $2})|.)*(?{ %h || print "No -"})
 /gx;
 <>

Список уникальных товаров по характеристике

Имеется файл, содержащий описание отношения “иметь цвет”

Назв1 цвет1
назв2 цвет1
назв1 цвет4

Требуется по заданному цвету вывести количества различных названий.

Программа должна иметь вид:

use re 'eval'; $_ = join ",<файл>; / .../gxms

Решение

 use re 'eval';
 %names=();
# $_="myass is red\nyour green\nhi there red\nbye blue\nanton red\nanton red\n";
open F,"input.txt";
 $_=join '',<F>;
 /(^([\w ]+?)\s(\w+)\n)(??{ %names->{"$3"}{"$2"}=1;})/gxm;
for $color(keys(%names)) { print "$color - > ".keys(%{$names{$color}})."\n";}

Класс скаляр

Написать класс для связывания скаляра.

Наследник StdScalar. Без собственного конструктора, но с собственными методами STORE и getvalues, в которых реализована возможность выдать все различные значения, когда-либо присвоенные скаляру.

P.S. 1 и ‘1’ - это разные значения.

Код класса

package MySc;
my %values;
use Tie::Scalar;
 @ISA = qw(Tie::StdScalar);
sub STORE {
my ($me, $v) = @_;
if (defined($v)){
if (ref($v)) {$v="ref:$v";}else{
if (("$v")^$v) { $v="\'$v\'";}
 $v ="\'\'" if $v eq '';} }
else {
 $v ='undef';}
 $values{$me}{$v}++;
}
sub getvalues { return (keys %{$values{$_[0]}});}
sub DESTROY{
delete $values{$_[0]};}
1;

Программа

#!/usr/bin/perl -w
use MySc;
 $,=" ";
 $a_o= tie $a, 'MySc';
for (1, 4, 6, '1',4, undef, '', \$a_o){
 $a=$_;}
print ($a_o->getvalues());