Toon posts:

[PERL] Perl.NET en PerlASPX

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ontdekte een paar dagen geleden twee nieuwe producten van ActiveState : Perl.NET en PerlASPX. En omdat ik Perl wel een aardig taaltje vind ;) Heb ik het eens gedownload en eens naar gekeken.

Wat is het?
PerlNET voegt een extra taal toe aan Microsofts .NET Hierdoor wordt het dus mogelijk om programma's en libraries in Perl te schrijven en eventueel in andere talen te gebruiken. PerlASPX maakt het embedden van Perl in ASP.NET pagina's mogelijk.

Hoe werkt Perl.NET?
Vrij simpel. Je maakt een normaal perl bestand (.pl) en compileert die met plc (PerL Compiler) naar een .exe:
code:
1
2
3
4
5
use namespace "System"; # uses System; in C#
use PerlNET qw(AUTOCALL);
Console->WriteLine("Hello World!");  # Maakt nu gebruik van de .NET library
# Ik heb even getest en
print "Hello World"; # Werkt ook gewoon nog

Ook schijn je gewoon perl modules die al bestaan te kunnen gebruiken (hoewel dat bij mijn eerste poging al mis ging). En Perl modules kun je ook compileren tot .dll.

Een simpel voorbeeldje van het gebruik van WinForms in Perl:
code:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package HelloWorldForm;
use strict;
use PerlNET qw(with AUTOCALL);

use namespace "System";
use namespace "System.Windows.Forms";
use namespace "System.Drawing";

=for interface
    [extends: Form]
    [STAThread]
    static void Main();
    private field TextBox textBox1;
    private void button1_Click(any sender, EventArgs evArgs);
=cut

sub Main {
    my $self = HelloWorldForm->new;
    Application->Run($self);
}

sub HelloWorldForm {
    my $this = shift;

    with(my $textBox1 = TextBox->new(),
       Text     => "Hello Windows Forms World",
       Location => Point->new(16, 24),
       Size     => Size->new(360, 20),
       TabIndex => 1);

    with(my $button1 = Button->new(),
     Text     => "Click Me!",
     Location => Point->new(256, 64),
     Size     => Size->new(120, 40),
     TabIndex => 2);

    $button1->add_Click(EventHandler->new($this, "button1_Click"));

    my $height = SystemInformation->CaptionHeight;
    with($this,
       Text       => "Hello Windows Forms World",
       AutoScaleBaseSize => Size->new(5, 13),
       ClientSize     => Size->new(392, 117),
     MinimumSize     => Size->new(392, int(117 + $height)),
       AcceptButton => $button1,
       textBox1     => $textBox1);

    $this->{Controls}->Add($_) for $textBox1, $button1;
}

sub button1_Click {
    my($this, $sender, $evargs) = @_;
    MessageBox->Show("Text is: '$this->{textBox1}->{Text}'");
}

Hoe werkt PerlASPX?
PerlASPX brengt wat voordeeltjes met zich mee. ASP.NET programma's worden bij de eerste uitvoering gecompileerd en gecached, waardoor bij een tweede keer uitvoeren je een gecompileerd programma uitvoerd. Dit in tegenstelling tot Perl via CGI waar code elke keer opnieuw gecompileerd wordt.

Voorbeeld code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ Page Language="perl" %>
<html>
<body>
<h2>ASP-Style Sample</h2>
Static content at the top. <br><br>

<%
    use strict;
    $this->{Response}->Write("Dynamic content.<br>");
%>

Hello <%= ucfirst("world!") %>

<p>Static content at the bottom.

<p>The time is now <%= substr(localtime, 11, 8) %>.

</body>
</html>

Niet bijzonder schokkend dus.

Waarom zou ik Perl.NET/ASPX gebruiken?
Tja, daar ben ik nog niet helemaal over uit. Perl heeft voor het manipuleren van bestanden en databases veel handige voorzieningen (met name de geweldige reguliere expressies). Hoe deze naar IL code omgezet worden weet ik niet, of dit een beetje efficiënt gebeurt weet ik ook niet.
Verder is het wel zo dat Perl.NET waarschijnlijk de makkelijkst te leren taal is die nu onder .NET draait. Perl lijkt erg op PHP (of beter gezegd, PHP lijkt erg op Perl). Met PerlASPX is het dus ook mogelijk om Perl te embedden in HTML (het oorspronkelijke idee achter PHP).
Wat ik zo snel even gezien heb is dat in Perl.NET Perl en .NET variabelen een beetje gescheiden blijven. In Perl.NET kun je .NET variabeletypen gebruiken (je kan gewoon een Integer object maken). Maar het hoeft niet. Je kan nog steeds alle truukjes met array met dynamische lengtes, hashes en automatische omzetting van het ene type variabele naar het andere ($a = "2"; $a += 2; $a == 4) gebruiken. Maar zoals ik al zei, hoe dit naar IL omgezet wordt? Ik heb geen flauw idee. Ik heb geen benchmarks gedaan.

Links
ActiveState website
Meer informatie over Perl.NET
Download Perl.NET
Meer informatie over PerlASPX
PerlASPX downloaden

[edit: Shit, vraag vergeten :P Ehm, wat denken jullie ervan? Is Perl.NET een goede uitbreiding van het .NET platform? Zijn jullie van plan het te gaan gebruiken?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Cool stukje :) . Duidelijk, informatief en interessant!

Helaas ben ik niet echt op de hoogte van Perl dus ik heb een vraag die ik zelf moeilijk kan beantwoorden: In hoeverre is Perl aangepast om goed binnen .NET te kunnen draaien? Moet je speciale constructies gebruiken om code geschreven in Perl goed te kunnen gebruik vanuit bijvoorbeeld C#?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Op vrijdag 25 januari 2002 13:08 schreef mbravenboer het volgende:
In hoeverre is Perl aangepast om goed binnen .NET te kunnen draaien? Moet je speciale constructies gebruiken om code geschreven in Perl goed te kunnen gebruik vanuit bijvoorbeeld C#?
Ik heb hier zelf nog niet echt mee ge-experimenteerd, maar dit is een voorbeeld dat er bij zit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package WWW::Babelfish; # Dit is standaard Perl om een namespace aan te geveen

# Dit is iets speciaal voor .NET, geeft door aan .NET
# wat voor methoden er geimplementeerd worden en wat hun
# parameters en return values zijn:
=for interface
    [interface: pure]
    static Babelfish();
    str translate(str key1, str value1,
          str key2, str value2,
          str key3, str value3);
    wantarray! str[] languages();
=cut
# Nu voegt hij verder de standaard Perl module Babelfish
# in (waar ik de code helaas niet van heb kunnen vinden :D
require WWW::Babelfish;
# Maar ik neem aan dat je hier gewoon iets van:
sub translate
{
   my @params = @_;
   # bla bla
   return $translatedword;
}
# krijgt

Dit kun je gebruiken in je C# programma met:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;

class main
{
    public static void Main(string[] args)
    {
      string text = "The quick brown fox jumps over the lazy dog";
      string[] lang = { "French", "German", "Spanish", "Italian" };

      Console.WriteLine("{0}: {1}", "English", text);
      using (WWW.Babelfish fish = new WWW.Babelfish()) {
        foreach (string dest in lang) {
            string trans = fish.translate("source",  "English",
                                "destination",  dest,
                                "text",    text);
            Console.WriteLine("{0}: {1}", dest, trans);
        }
        Console.WriteLine();

        foreach (string str in fish.languages())
            Console.WriteLine("Language: {0}", str);
      }
    }
}

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Aha... als ik het zo bekijk zie je dus weer hetzelfde fenomeen als bij Mondriaan, VB .NET, J# en C++. Taal-onafhankelijkheid is prachtig, maar paradigma's verschillen gewoon op essentiele punten.

Libraries geschreven in het ene paradigma kunnen simpelweg niet op een logische manier gebruikt worden vanuit een andere paradigma.

Je ziet bij alle talen die op .NET draaien dat ze op kleine of grote punten worden aangepast om daar ook op een redelijke manier in gebruikt te kunnen worden. Op zich is dat geen ramp en het maakt het concept ook niet waardeloos, maar het is wel goed om dit te blijven beseffen :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Ja klopt. Ik was ook erg benieuwd hoe ze dit bij Perl op zouden gaan lossen.

Ik denk dat als je ooit een programma of library moet schrijven dat veel aan data interpretatie moet doen, dat een combinatie van Perl.NET met een andere taal dan erg geschikt is.