Thread indexzähler in for-schleife? (11 answers)
Opened by Muffi at 2014-11-21 14:56

topeg
 2014-11-22 12:43
#178514 #178514
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Methods: (5 + 9).ToString;
Das Problem hierbei ist, das Perl im Perl5 im Kern nicht Objektorientiert arbeitet.
Sowas:
Code: (dl )
(5+9)->toString()
geht halt nicht so einfach. Nur so was kann man machen:
Code (perl): (dl )
Math::Number->new(5+9)->toSting()
(oder wie man die Klasse nennen will) Das Hauptproblem ist, das Zahlen keine Referenzen sind (die blessed sind). Perl würde also das hier: (5+9)->toString() so interpretieren: 14->toString() Da würde also nach der Klasse "14" gesucht werden. Sicherlich könnte man da mit Autoload oder ähnlichem tricksen und eine Klasse dynamisch erzeugen die von "Math::Number" (oder so) erbt.
Völlig unmöglich es es also nicht das Verhalten nachzubilden. Nur hat sich keiner bisher die Mühe gemacht.

var byLength := from n in Names order by n.Length
Code (perl): (dl )
my @byLength = sort{ length($a) <=> length($b) } @Names;

Das ist nur unwesentlich länger.
Sicher mit SQL-Like Statements kann man einiges machen. Aber das funktioniert nur richtig wenn alles Objekte mit vordefinierten Attributen sind. Das ist bei Perl5 nicht der Fall. Bei Perl6 sieht das ganz anders aus. Da kann man etwas passendes definieren, auch weil der Parser flexiebler ist.
Aber auch in Perl5 man kann durchaus ein Paket bauen das ähnliches bietet:
ungetestet:
Code (perl): (dl )
my @byLength = from my $n, in @names, order_by { length($n) };

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sub from(\$$$){
  my ($ref,$list,$code)=@_;
  return sort{
    $$ref = $a ;
    my $ra = $code->();

    $$ref = $b ;
    my $rb = $code->();

    no warnings;
    $ra <=> $rb or $ra cmp $rb
  }@$list;
}
sub in(\@) { return $_[0]; }
sub order_by(\&) { return $_[0] }

Ein vollständige Implementation wäre ein enormer Aufwand.

Class Contracts: require aIncBy > 0;
Hält in Perl (möglicherweise / wahrscheinlich?) Einzug:
Code (perl): (dl )
sub Inc($self,$aIncBy > 0){ $self->{fValue}+=$aIncBy; ....}

Bitte korrigiert mich wenn hier hier falsch liege. So habe ich das zumindest in Erinnerung.

Enhanced Boolean Comparisons: if 5 < x <= 10 then begin
Das wäre wirklich Praktisch. Das ist etwas was ich immer gerne schreiben würde:
Code: (dl )
if(0 < $x < 100) { ... 
anstatt
Code (perl): (dl )
if(0 < $x and $x < 100) { ... 

Zwar kann man da mit $_ tricksen das ganze ist aber nicht so schön anzuschauen.
Das Problem dabei ist der Parser von Perl. so etwas: 0 < $x < 100 kann bestehenden Code leicht kaputt machen und ist eine extreme Ausnahme im Parser. Ich denke Das sich einfach noch keiner getraut hat das in den Parser zu bauen. Ich kann mich dunkel erinnern das es Sourcefilter gibt das so was umwandeln können.

View full thread indexzähler in for-schleife?