Schrift
[thread]11950[/thread]

grep inputfile geht nicht mit übergebener Variablen



<< >> 4 Einträge, 1 Seite
allapow
 2008-06-01 14:06
#110536 #110536
User since
2008-06-01
1 Artikel
BenutzerIn
[default_avatar]
hallo Forum,

ich möchte in einer Liste nachsehen ob ein gewisser Eintrag vorhanden ist. Das ist soweit kein Problem, nur möchte ich diesen Suchstring öffter verändern und darum als Variable in die grep funktion einfügen. Das geht aber bei mir nicht...
hier mal der Code:

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

open( INPUTFILE, $ARGV[0]) || die "Konnte die Datei nicht öffnen";

while(<INPUTFILE>){
my $b = "/bla/";        # /bla/ /'bla'/ 'bla' "bla" usw geht alles nicht
print $b,"\n";
my $a = grep {$_ = $b} <INPUTFILE>;     # statt $b /bla/ funktioniert
if ($a == 1) {print"Eintrag vorhanden!\n";}
else{print"Keinen Eintrag gefunden!\n"};
}
close( INPUTFILE );


wie kann ich das bewerkstelligen, was verstehe ich hier nicht?
:-( blutige Perlanfängerfrage bestimmt... wo gibt es die passenden Infos für mich?
Gast Gast
 2008-06-01 14:20
#110537 #110537
- $a und $b werden von Perl selber verwendet, (bei sort)
- Reguläre ausdrücke bearbeitet man mit "=~//"
- Der Ausdruck kann mehr als einmal vorkommen

Code (perl): (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 $file=shift(@ARGV) || die "Bitte Dateinamen angeben!\n";
my $regexp=shift(@ARGV) || 'bla';
print "Überprüfe $file mit dem Ausdruck /$regexp/ \n";

open( INPUTFILE, $file) || die "Konnte $file nicht öffnen";
while(<INPUTFILE>)
{
  my $back = grep {$_ =~/$regexp/} <INPUTFILE>;
  if ($back > 0)
  { print "Eintrag vorhanden!\n"; }
  else
  { print "Keinen Eintrag gefunden!\n"; }
}
close( INPUTFILE );
FoolAck
 2008-06-01 16:03
#110541 #110541
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Ich melde hiermit Zweifel an der Sinnhaftigkeit folgenden Konstrukts an:
Code: (dl )
1
2
3
while(<INPUTFILE>)
{
my $back = grep {$_ =~/$regexp/} <INPUTFILE>;

Wth, nicht nur, dass man filehandles eigentlich nicht in Listenkontext verwenden soll, hier wird erst Zeilenweise in der while-Schleife über "INPUTFILE" iteriert (erste Zeile) und dann der Rest durch den grep-Aufruf "geslurpt". (? Bin mir nicht völlig sicher, sollte aber ungefähr hinkommen.)
Außerdem arbeitet grep nicht nur mit Listen, sondern returned auch eine. Werden also zwei Einträge gefunden, wird eine 2-elementige-Liste returned, in skalarem Kontext also 2. Deswegen solltest du vielleicht $a nicht direkt auf Gleichheit mit 1 überprüfen... (Und überhaupt, abgesehen davon, dass "$a" und "$b" normalerweise für die sort-Funktion in perl reserviert sind, sinds auch verdammt schlechte Variablennamen...)

Was der Threadersteller will klingt eigentlich sehr einfach:
Code: (dl )
1
2
3
4
5
6
7
use strict;
use warnings;

my $re = 'foo';
print "hihi" if grep {/$re/} ("bla", "blub", "foo", "bar");
$re = 'baz';
print "hihi" if grep {/$re/} ("bla", "blub", "foo", "bar");

Wenn man Variablen als Regexes verwenden will kann/sollte man übrigens den qr (quoted regex) Operator benutzen:
Code: (dl )
my $regex = qr/bla*bl[u0o]{0,5}b/;

Oder so..

Ansonsten @"Wo gibts Hilfe?":
Hier werden sie geholfen!
(Sollte auch als manpages offline verfügbar sein, aber manche mögen html halt lieber.. (Auch die htmls und pdfs kann man sich btw für offline Betrachtung downloaden.))
pq
 2008-06-01 16:21
#110542 #110542
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
allapow+2008-06-01 12:06:22--
Code (perl): (dl )
my $a = grep {$_ = $b} <INPUTFILE>;     # statt $b /bla/ funktioniert

du machst hier eine zuweisung.
$_ = $b
weist den wert von $b $_ zu.
du willst wohl eher einen string-vergleich.
zahlen vergleicht man mit ==, nicht mit =, und strings vergleicht man mit eq
also
Code (perl): (dl )
grep { $_ eq $b } ...


ausserdem sind $a und $b keine tollen variablennamen. variablennamen sollten
möglichst dokumentieren, was sie beinhalten.
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
<< >> 4 Einträge, 1 Seite



View all threads created 2008-06-01 14:06.