Несколько задачек с зачёта
Строка с дефисами
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());