Klausi: Gültigkeit von Variablen

Hi,
kann mir jemand erklären, warum in der untenstehenden Routine text_build in der Version alt die Variablen $name und $value undefiniert sind, in der Version neu aber nicht. Was mich besonders stutzig macht ist, dass mail_text in beiden Versionen vorhanden ist.
Ist die Definition my (...) zu Programmbeginn nicht gleichwertig zu use vars ...?

#!/usr/bin/perl -w

use strict;
my (@names, @values, $mail_text, $name, $value);    <===== alt
my (@names, @values, $mail_text);                   <===== neu (ok)
......
use strict;
use vars qw(@EXPORT_OK $MailRegEx);                 <===== alt
use vars qw(@EXPORT_OK $MailRegEx $name $value);    <===== neu (ok)
....
sub text_build
   {
    $mail_text = $mail_text . $name . ": " . $value . "\n";
   }
.....
use CGI qw/:standard/;
use CGI::Carp qw(fatalsToBrowser);
.....
  $query = new CGI;
  @names = $query->param;
.....
  $mail_text="";
.....
  $name= ...;
  $value=...;
  text_build();
  .....

  1. Hallo Klausi,

    Ist die Definition my (...) zu Programmbeginn nicht gleichwertig zu use vars ...?
    use strict;
    my (@names, @values, $mail_text, $name, $value);    <===== alt
    my (@names, @values, $mail_text);                   <===== neu (ok)

    Wie my funktioniert sagt dir perldoc

    ......
    use strict;
    use vars qw(@EXPORT_OK $MailRegEx);                 <===== alt
    use vars qw(@EXPORT_OK $MailRegEx $name $value);    <===== neu (ok)

    Wie das vars-Pragma funktioniert, sagt dir auch perldoc (und zwar funktioniert das entschieden anders als "my"!)

    sub text_build
       {
        $mail_text = $mail_text . $name . ": " . $value . "\n";
       }

    wenn die Funktion allerdings nach der Deklaration der Variablen steht, müsste name & value in jedem Fall definiert sein. my und use vars bzw. our kann in diesem Fall analog verwendet werden, weil du dich im gleichen Scope befindest (sprich Namensraum, also Main::).

    text_build();

    müsste, so wie ich es verstanden habe, funktionieren. Aber es war ja auch nicht der ganze quelltext abgedruckt.

    Alternativ könntest du die benötigten Variablen ja auch einfach als Parameter übergeben. Das ist zwar weniger perfomant, weil Kopien, aber mit Pointern würdest du das Defizit größtenteils kompensieren ;-)

    Grüße,

    Sven

    --
    ich hatte mal meterlange signs, die sind alle weg
    1. Hallo Sven,

      das Problem ist, ich bin der englischen Sprache nicht mächtig, so dass ich schon Probleme habe mit der Definition des Scope und der übrigen Beschreibungen.
      Folge: no english - no homepage mit Perl?

      1. Moin Klausi,

        das Problem ist, ich bin der englischen Sprache nicht mächtig, so dass ich schon Probleme habe mit der Definition des Scope und der übrigen Beschreibungen.
        Folge: no english - no homepage mit Perl?

        Das ist ein übeles Problem, wenn man sich in auch jedweder form der Informatik-Branche beschäftigt. Hilfreich ist auch sowas wie http://dict.leo.org... sonst kann ich leider schlecht helfen :-(

        Grüße,

        sven