Schrift
[thread]6479[/thread]

Strukturelles Matching: Gibt es dafür ein Perlmodul?



<< >> 10 Einträge, 1 Seite
murphy
 2004-08-09 20:54
#85643 #85643
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Weiß jemand, ob es für Perl ein Modul gibt, mit dem man praktische strukturelle matching Konstrukte bauen kann? Also etwas, mit dem Code in der Art (vorsicht Pseudocode) möglich wird:
Code: (dl )
1
2
3
4
5
6
my $a = [1, [2, 3], 4];

match ($a) {
case [1, $b, ...]: print $b->[1]; # gibt 3 aus
...
}
When C++ is your hammer, every problem looks like your thumb.
kabel
 2004-08-09 21:20
#85644 #85644
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
sieht schwer nach CPAN:prolog aus :-)
UPDATE: aber ich weiss nicht, ob prolog dein problem loesen kann.\n\n

<!--EDIT|kabel|1092072178-->
-- stefan
kabel
 2004-08-09 21:33
#85645 #85645
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
sub match {
        my ($ref, $what) = @_;
        my $idx = 0;
         while ($idx<@$ref) {
               
 if (ref $what->[$idx] eq "SCALAR") {
               
         ${ $what->[$idx] } = $ref->[$idx];
               
 } elsif (
               
         (ref $what->[$idx] eq "ARRAY") or
               
         (ref $ref->[$idx] eq "ARRAY")) {
               
         match ($ref->[$idx], $what->[$idx]);
               
 }
               
 
               
 $idx++;
        }
}

my $a = [1, [2, 3], 4];
my $b;
match ($a, [1, \$b, 3]);
print $b->[1], $/;

match ($a, [1, [2, \$b], 3]);
print $b, $/;


vorsicht wegen structure sharing ... hth
fehlerbehandlung?\n\n

<!--EDIT|kabel|1092073157-->
-- stefan
murphy
 2004-08-09 21:33
#85646 #85646
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Eigentlich will ich kein System für "Logic Programming" sondern nur ein praktisches Konstrukt, dass mir das entwirren komplexer Datenstrukturen einfacher macht -- so eine Art reguläre Ausdrucksmaschine für Datenstrukturen. Einige funktionale Programmiersprachen haben so etwas standardmäßig (z.B. Haskell, Clean, SML).
When C++ is your hammer, every problem looks like your thumb.
kabel
 2004-08-09 21:42
#85647 #85647
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
cool. die sprachen kenn ich net.
ich erwaehnte deswegen prolog, weil das die einzige mir bekannte ist, die das kann.

sorry, dass ich deine frage nicht beantwortet habe ...
den code haettest du selber wahrscheinlich auch bauen koennen.\n\n

<!--EDIT|kabel|1092073447-->
-- stefan
esskar
 2004-08-09 22:09
#85648 #85648
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
SML ist darin echt sau stark...
http://www.ps.uni-sb.de/courses/prog-ws02/software.html\n\n

<!--EDIT|esskar|1092075000-->
betterworld
 2004-08-10 02:34
#85649 #85649
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
OK, das hier ist vielleicht nicht die schoenste Methode:
Code: (dl )
1
2
3
4
5
use Data::Dumper;
$a=[1,[2,3],4];
$d=Dumper($a);
$d =~ s/.*=//;
$d =~ /^\s*\[\n(\s*)1,\n((?:.*\n)*?\1[^\s].*?,)/m and print eval ($2)->[1];
\n\n

<!--EDIT|betterworld|1092091086-->
kabel
 2004-08-10 11:24
#85650 #85650
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
so, hier ein paar CPAN module:

dem anscheine nach implementiert CPAN:Data::Match was du willst.
der CPAN:Array::Patternmatcher sieht auch nett aus.

HTH nu endlich :-)
-- stefan
esskar
 2004-08-11 02:41
#85651 #85651
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
man kann sich auch mal

CPAN:Language::Functional anschauen
murphy
 2004-08-14 00:01
#85652 #85652
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Cool, Data::Match und Language::Functional sind genau die zwei Module, die mir noch gefehlt haben, um mit Perl genauso glücklich wie mit Scheme zu sein ;)

Danke für die Tips!
When C++ is your hammer, every problem looks like your thumb.
<< >> 10 Einträge, 1 Seite



View all threads created 2004-08-09 20:54.