Schrift
[thread]8911[/thread]

Variable als subname: Subroutine funzt ned

Leser: 1


<< >> 8 Einträge, 1 Seite
dyspro
 2007-04-10 00:26
#75770 #75770
User since
2007-03-20
3 Artikel
BenutzerIn
[default_avatar]
1 #!/usr/bin/perl
2 use strict;
3 use warnings;
4 sub main {
5 my $eingabe = readline<STDIN>;
6 &$eingabe;
7 }
8 sub hello {
9 print "hi";
10 }
11 &main;


Das is mein code nur wenn ich den ausführen will und hello eingebe kommt folgende meldung:

readline() on unopened filehandle hello
Use of uninitialized value in subroutine entry at fut.pl line 6.
Can't use string ("") as a subroutine ref while "strict refs" in use at fut.pl line 6.


das ist nur in bispiel code. den richtigen code will ich nich veröffntlichen nur mir gehts ums prinzip das ich durchs eingeben von sachen eine subroutine ohne viele if und elsif's aufrufen will und das ist für mich die einzigste möglichkeit
bloonix
 2007-04-10 00:45
#75771 #75771
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo dyspro,

[quote=dyspro,09.04.2007, 22:26]1 #!/usr/bin/perl
     2 use strict;
     3 use warnings;
     4 sub main {
     5      my $eingabe = readline<STDIN>;
     6      &$eingabe;
     7 }[/quote]
hier liegt ein grosses Missverständnis vor! :) $eingabe ist keine
Routine, sondern ein Skalar (im perlschen Kontext) und einen
Skalar spricht man mit einem Dollarzeichen an, deshalb kann
das auch nicht funktionieren. Ein UND-Zeichen ist für Routinen
gedacht, wie sie mit sub{} erzeugt werden. Erkennst du
deinen Fehler? Das kannst du auch nochmal zum besseren
Verständnis in Perldoc nachlesen.

perldata

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use strict;
use warnings;

sub main {
    my $eingabe = <STDIN>;
    &hello; # hello ist eine Routine
    print $eingabe, "\n"; # $eingabe ist ein Skalar
}

sub hello {
  print "hi ";
}

&main;


Gruss,
opi\n\n

<!--EDIT|opi|1176151622-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
dyspro
 2007-04-10 00:53
#75772 #75772
User since
2007-03-20
3 Artikel
BenutzerIn
[default_avatar]
$ ----> das dees für skalar steht und nen & für subs weiß ich au ^^ ich will nur das dr variablen inhalt in dem fall hello wenn ichs eingegeben hab die jeeweilige subroutine aufruft

ich war php progger daher weiß ich das sowas in php geht :

$hello = "buuh";
$$hello = "ahhhh";

also is $buuh = "ahhhh"


geht sowas in perl gand?
bloonix
 2007-04-10 01:21
#75773 #75773
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo dyspro,

hier das - in ICQ - versprochene Codestück... was du brauchst ist wohl
ein Hash, wenn du einen String über STDIN eingibst und diesen String
als "Variable" ansprechen möchtest.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use strict;
use warnings;

my %bausteine = (
  begruessung => sub { print "Hallo du da\n\n" },
  abschied    => sub { print "Mit freundlichen Gruessen\n" },
  mein_name   => sub { print "dyspro\n" },
);

sub main {
  print STDOUT "Eingabe: ";
  my $eingabe = <STDIN>;
  chomp($eingabe);
  $bausteine{$eingabe}()
     if defined $bausteine{$eingabe};
}

&main;


#> skript.pl
Eingabe: begruessung

Hallo du da



Gruss,
opi

Edit: Codefehler beseitigt\n\n

<!--EDIT|opi|1176154003-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
pq
 2007-04-10 03:03
#75774 #75774
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=dyspro,09.04.2007, 22:53]geht sowas in perl gand?[/quote]
gand? gans? ganz?

ja, es geht, aber sowas will man nicht. vielleicht macht man das in php
so, aber sauberer ist es, wenn man einen dispatcher benutzt, so
wie opi es z.b. gezeigt hat. denk immer daran, dass das programm
in einem jahr vielleicht jemand maintainen muss - das kannst sogar
du selbst sein. je sauberer, desto weniger ärger hast du späterr.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
topeg
 2007-04-10 03:53
#75775 #75775
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ein Aufruf mit "&$funktionsname" wäre recht gefährlich, da man damit auch Funktionen aufrufen kann, die potentiell gefährlich sind. Es gibt keine Möglichkeit interne Funktionen von öffentlichen zu unterscheiden.
Stelle dir nur mal vor, du hättest eine Funktion wie "sub delete_all_data" und die wäre wie von dir beschrieben ansprechbar. Der Schaden kann enorm sein.\n\n

<!--EDIT|topeg|1176162849-->
Froschpopo
 2007-04-10 13:04
#75776 #75776
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ich würds vorher wenigstens mit exists verifizieren:
Code: (dl )
1
2
3
4
5
6
7
8
9
my %subrefs = (
name => \&func
);

if (exists $subrefs{$var}) {
&{$subrefs{$var}};
} else {
print "Funktion existiert nicht\n";
}
Sucher
 2007-04-10 13:42
#75777 #75777
User since
2007-03-26
47 Artikel
BenutzerIn
[default_avatar]
Der vollständigkeit halber, und obwohl man es niemals, niemals, jemals machen soll. - Es geht natürlich auch ohne dispatch-table:



Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use strict;
use warnings;


while(my $eingabe = <STDIN>){
chomp $eingabe;
no strict;
&$eingabe;
use strict;
}

sub hello{
print "hi";
}
sub del{
unlink $0;
}
<< >> 8 Einträge, 1 Seite



View all threads created 2007-04-10 00:26.