Schrift
[thread]11675[/thread]

Problem mit array ref und use strict

Leser: 1


<< >> 8 Einträge, 1 Seite
toppsino
 2008-04-21 14:54
#108631 #108631
User since
2006-07-29
18 Artikel
BenutzerIn
[default_avatar]
Hallo!
Wenn ich im folgenden "use strict" verwende bekomme ich die Fehlermeldung
"Can't use string ("dieses") as an ARRAY ref while "strict refs" in use. Ohne strict geht das ganze. Das ist vielleicht nur ein Sytaxfehler, aber ich sitze jetzt schon über eine Stunde und bekomme es einfach nicht hin. Was mache ich - schon wieder - falsch?
Sorry, aber ich bin blutiger Anfänger und benutze Perl nur ab und zu

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

my @{dieses} = qw (aaaa bbbbbb cccccc ddddddddddddd);
my $xyz="dieses";

# Das Geht
foreach my $wert (@{dieses}) {
print "$wert\n";
}

# Das nicht "Can't use string ("dieses") as an ARRAY ref while "strict refs" in use at x.pl line 12."
foreach my $wert (@{$xyz}) {
print "$wert\n";
}


DANKE
Linuxer
 2008-04-21 15:18
#108633 #108633
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi,

du willst keine symbolischen Referenzen verwenden, und "use strict;" sagt Dir das ;o))

In aller Regel handelst Du Dir mehr Ärger damit ein als ohne.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
renee
 2008-04-21 15:41
#108636 #108636
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Sag uns Deinen Anwendungfall und wir sagen Dir, wie Du das strict-konform umsetzen kannst...

Linuxer hat völlig recht! Auf symbolische Referenzen solltest Du verzichten. Es gibt auch andere Lösungen - und die sind besser...
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/
toppsino
 2008-04-21 15:55
#108639 #108639
User since
2006-07-29
18 Artikel
BenutzerIn
[default_avatar]
renee+2008-04-21 13:41:26--
Sag uns Deinen Anwendungfall und wir sagen Dir, wie Du das strict-konform umsetzen kannst...

Linuxer hat völlig recht! Auf symbolische Referenzen solltest Du verzichten. Es gibt auch andere Lösungen - und die sind besser...


Der Anwendungsfall ist ganz simpel. Ich möchte einfach Arrays in einer Schleife verarbeiten.
Ich habe zum Beispiel logfile1, logfile2 und logfile3 die ich in jeweils ein Array einlsen will. @log{1}, @ log{2}, @log{3}. Wenn ich das dann mit
Code: (dl )
foreach my $zeile (@log{1}) { mach_was }
geht es. Aber wenn ich eine variable verwende
Code: (dl )
foreach my $zeile (@log{$variable}) {mach_was}
eben nicht. Ohne use strict geht beides!?!?!
Kann schon sein, das mein Ansatz oder die Syntax völlig verquer ist, aber ich fange ja auch erst "klein" an ... :)
Die $variable will ich verwenden, da ich noch eine Schleife [1..3] drüberlegen will ...
Taulmarill
 2008-04-21 15:57
#108640 #108640
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Wenn du $xyz als Referenz auf @dieses deklarierst, sollte das gehen:
Code: (dl )
1
2
my @dieses = qw (aaaa bbbbbb cccccc ddddddddddddd);
my $xyz = \@dieses;


lies: perlreftut
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Taulmarill
 2008-04-21 16:00
#108642 #108642
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
@log{1} ist ein Hashslice. Wenn du auf das zweite Element des Arrays @log zugreifen willst, benutze $log[1]. Benutze am besten use warnings; und use sctrict; von Anfang an und schalte die Pragmas nicht während der Entwicklung des Scripts ein und aus damit dir solche Fehler schneller auffallen.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
renee
 2008-04-21 16:05
#108643 #108643
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn Du mit irgendwelchen Variablen arbeitest könntest Du mit einem Array of Arrays arbeiten:

Code (perl): (dl )
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
use Data::Dumper; # nur um sich dann mal die Datenstruktur anzuschauen

my @logfiles;
for (1..3){
    my $file = 'logfile' . $_ . '.log';
    open my $fh, '<', $file or die $!;
    my @lines = <$fh>;
    # Referenz auf die Zeilen in einem Array speichern
    $logfiles[$_] = \@lines;
    close $fh;
}

# im zweiten Element (weil Arrays mit Index 0 anfangen) ist jetzt eine
# Referenz auf ein Array mit den Zeilen von logfile1.log, im dritten Element
# eine Referenz auf ein Array mit den Zeilen von logfile2.log,...

# einfach mal die Datenstruktur ausgeben
print Dumper( \@logfiles ),"\n";

# irgendwas anderes

# gebe alles von logfile2.log aus:
my $logfile_nr = 2;
my @logfile_lines = @{$logfiles[$logfil_nr]};

print $_ for @logfile_lines;
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/
toppsino
 2008-04-21 16:21
#108646 #108646
User since
2006-07-29
18 Artikel
BenutzerIn
[default_avatar]
@renee: Danke, ich glaube das ist es was ich meinte :)
Kann es aber leider erst heute Abend ausprobieren.
Danke an alle für die Unterstützung!
<< >> 8 Einträge, 1 Seite



View all threads created 2008-04-21 14:54.