Thread schöne? mengenschreibweise: mit Set::Scalar (0 answers)
Opened by kabel at 2003-08-20 04:03

kabel
 2003-08-20 04:03
#68014 #68014
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
dieser link ist schuld! :p

Set::Scalar überlädt schon die operatoren, so dass sie mengen-semantik aufweisen. analog zu dem artikel hier eine erweiterung von Set::Scalar, die das gleiche erlaubt:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use Text::ParseWords ();
my %_const_handlers = (
q => sub {
if ($_[0] =~ m/^\([ \.\d\w]*\)$/) {
my $str = substr $_[0], 1, length ($_[0]) - 2;
my @elems = Text::ParseWords::quotewords (qr/\s+/, 0, $str);
# { local $"="+"; print "[@elems]\n"; }
if (defined $elems[1] and $elems[1] eq "..") {
@elems = $elems[0] .. $elems[2];
}
return ->new (@elems) || $_[1];
} else {
return $_[1];
}
},
);

sub import { overload::constant %_const_handlers; }


ich hab $VERSION="1.17" installiert, kopiert den code direkt unter diese variable. danach geht folgendes:

Quote
kabel@linux:~/progs/perl/set> cat test.pl
use strict;
use Set::Scalar;

my $s1 = '(1 .. 12)';
my $s2 = '(1 2)';

# differenz
my $s3 = $s1 - $s2;
print $s3, $/;

# unique elements (rechtsassoziativ)
$s3 = $s1 / '(2 .. 13)' / '(4)';
print $s3, $/;

# proper subset
if ($s2 < $s1) {
print "yes", $/;
}

print STDOUT '(a .. z)', $/;
kabel@linux:~/progs/perl/set> perl -w test.pl
[(1 .. 12)+(1 .. 12)+q]
[(1 2)+(1 2)+q]
[(2 .. 13)+(2 .. 13)+q]
[(4)+(4)+q]
[yes+yes+q]
[(a .. z)+(a .. z)+q]
(10 11 12 3 4 5 6 7 8 9)
(1 13 4)
yes
(a b c d e f g h i j k l m n o p q r s t u v w x y z)
kabel@linux:~/progs/perl/set>


im CPAN:pod steht natürlich noch viel mehr. bei mengenoperationen hab ich ziemlich viele fragen von anderen postern im kopf, mit dem modul ist alles hinfällig. genial. 8)

so genial vielleicht doch nicht. mal angenommen, ich will ein array in eine menge wandeln. das geht praktisch nur mit der oo-syntax. naja. ausserdem sieht das ungewohnt aus, und mit overload::constant muss einer so und so vorsichtig sein, dass einer nicht fremde sachen rumschiebt. darauf geht der aritkel AFAIR gar nicht ein. und die CPAN:POD ist mir jetzt zu langwierig...
(perl6 => neuer operator => fertig => ich könnte heulen)\n\n

<!--EDIT|kabel|1061338025-->
-- stefan

View full thread schöne? mengenschreibweise: mit Set::Scalar