Schrift
[thread]11005[/thread]

Globale Variable in einer subroutine erschaffen



<< >> 9 Einträge, 1 Seite
Gast Gast
 2007-12-11 18:36
#103740 #103740
Hallo,

ich würde gerne jedes mal, wenn ich eine bestimmte subroutine durchlaufe, einen hash erschaffen, der global gültig ist (bzw. eben auch noch gültig, nachdem die sub zu ende ist)
Zudem soll dann derName des Hashs eindeutig sein. Also z.b. so:

semipseudocode
sub test {
global %hash$_[0] = ( key1 => "value1", key2 => "value2");
}



Ist das in perl irgendwie möglich? wenn ja, wie kann ich das realisieren?
Danke schonmal für eventuelle Antworten
renee
 2007-12-11 20:12
#103743 #103743
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Auch wenn man globale Variablen möglichst vermeiden sollte:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl

use strict;
use warnings;

my %global_hash;

sub1();
sub2();

sub sub1{
    $global_hash{test} = 'world'M
}

sub sub2{
    print $global_hash{test};
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
lichtkind
 2007-12-11 20:21
#103744 #103744
User since
2004-03-22
5697 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
da man ja meist mit use strict programmiert und man so probleme bekommen könnte kannst du ja schreiben wenn du global meinst:

Code (perl): (dl )
%main::variablename;


oder du benutzt our.

Code (perl): (dl )
our %name;


Dann lebt die variable auch weiter gehört aber zu dem paket in dem du befindest kann aber auch ausserhalb des paketes unter paket::var gerufen werden.
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
murphy
 2007-12-11 21:00
#103745 #103745
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Wenn außerdem der Name des Hashes dynamisch generiert werden soll, muss man wohl die Symboltabellen direkt modifizieren:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use strict;
use warnings;

use Data::Dumper;

sub create_hash($) {
my $id = shift;
$main::{"hash_$id"} = { id => $id, data => 'rhabarber' }
}

create_hash("foo");

our %hash_foo;
print Dumper \%hash_foo;


Allerdings ist diese ganze Vorgehensweise wahrscheinlich keine gute Idee. Zumindest sollte man nicht den globalen Namensraum verschmutzen sondern alle generierten Variablen in ein bestimmtes Paket legen. Viel besser wäre es aber zum Beispiel, aus der Subroutinen eine Referenz auf einen Hash zurückzugeben. Oder vielleicht nur einen globalen Hash zu verwenden, der Referenzen auf weitere Hashes enthält...
When C++ is your hammer, every problem looks like your thumb.
Gast Gast
 2007-12-12 11:55
#103757 #103757
ok, ich habe mal versucht es mit einem globalen hash zu machen, wie du gemeint hast, murphy.

allerdings bin ich mir nicht sicher, ob es so überhaupt geht und wie ich dann auf die einzelnen attribute zugreifen kann etc.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package Paket;
use strict;
use warnings;
 
 #contructor
 sub new {
        my $class = shift;
        my $self = {@_}
        bless ($self, $class);
        return $self;
 }
 
 
 #beispiel get-method
 sub firststart {
        my $self = shift;
        my %hash = %$self;
        return $hash{firstStart};
 }
 
 1;


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl
use strict;
use warnings;
use Paket;

my %pak_dump{};



sub startNewPack {

        startPackOnRemoteHost();
        
        #$_[0] soll eine beliebige zahl sein, die als parameter übergeben wird
        $pak_dump{$_[0]} = Paket->new( firstStart => 123, schedule1 => 0, schedule2 => 0, schedule3 => 1);
}
renee
 2007-12-12 12:20
#103760 #103760
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
*Was* willst Du eigentlich machen?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2007-12-12 12:34
#103762 #103762
nunja, ich möchte über das netzwerk programme auf anderen pcs starten und dann für jedes gestartete programm eine datenstruktur anlegen,
in der ich informationen über den fortschritt der programme (wird alle paar minuten ermittelt) abspeichern kann.

Das problem ist eben, dass ich für das starten der programme eine subrutine benutze,
und wenn ich dann darin eine datenstruktur anlege und infos abspeichere, dann geht die ja verloren, sobald die subroutine fertig ist.
Deswegen wollte ich eben die Infos irgendwie dauerhaft (mindestens für die laufzeit meines programms) abspeichern,
damit ich sie, wann immer ich will, abrufen und weiterverarbeiten kann
renee
 2007-12-12 12:52
#103765 #103765
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
(kein richtiger Perl-Code, sondern nur angedeutet)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

use strict;
use warnings;

my %hash = start_all_programs();

print $hash{pc1}->{program};

sub start_all_programs{
my %tmp;

for my $pc ('pc1','pc2'){
$tmp{$pc}->{program} = 'test';
}

return %tmp;
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
murphy
 2007-12-12 19:27
#103796 #103796
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Gast+2007-12-12 11:34:10--
nunja, ich möchte über das netzwerk programme auf anderen pcs starten und dann für jedes gestartete programm eine datenstruktur anlegen,
in der ich informationen über den fortschritt der programme (wird alle paar minuten ermittelt) abspeichern kann.
[...]


Warum lässt Du die Routine zum Starten der Aufträge nicht einfach ein Objekt zurückgeben, dass Methoden bereitstellt, mit denen man den Status des Auftrages abfragen kann.

Wenn es unbedingt nötig ist, den Status automatisch, zeitgesteuert und asynchron zu aktualisieren, statt das nur auf Anfrage zu tun, dann empfiehlt sich wahrscheinlich die Verwendung von Threads, Prozessen oder POE...
When C++ is your hammer, every problem looks like your thumb.
<< >> 9 Einträge, 1 Seite



View all threads created 2007-12-11 18:36.