Variable Parameter matchen
Variable Parameter matchen
am 11.08.2006 10:37:30 von Reinhard Pagitsch
Hallo NG,
An ein Script kann ich eine variable Anzahl an Parametern übergeben.
Der erste ist eine Datei und die anderen sind match Parameter. Diese
match Parameter übergebe ich an ein Array. So weit so gut.
Wie aber kann ich dann diese Werte im Array benützen um in einem String
danach zu suchen? Sie müssen alle matchen.
Das Script:
use strict;
my $file=$ARGV[0];
my $anz=@ARGV-1;
my @what=(); # holds the other arguments
my $count=0;
for(1 .. $anz)
{
$what[$count]=$ARGV[$_];
$count++;
}
open(FH, $file)or die "can not open $file\n";
$count=0;
while()
{
if($_ =~ /$what[0]/&& $_=~ /$what[1]/)
# Wie kann ich hier das Array @what einsetzen?
{
#print "$_";
$count++;
}
}
print "The number: $count\n";
Danke,
Reinhard
--
PM replays nur an reinhard dot pagitsch at isis-papyrus dot com.
Die Adresse im From/Replay To wird nicht gelesen.
Re: Variable Parameter matchen
am 11.08.2006 11:19:42 von Christian Kirsch
Reinhard Pagitsch schrieb:
> Hallo NG,
>
> An ein Script kann ich eine variable Anzahl an Parametern übergeben.
> Der erste ist eine Datei und die anderen sind match Parameter. Diese
> match Parameter übergebe ich an ein Array. So weit so gut.
> Wie aber kann ich dann diese Werte im Array benützen um in einem String
> danach zu suchen? Sie müssen alle matchen.
>
>
> Das Script:
> use strict;
> my $file=$ARGV[0];
> my $anz=@ARGV-1;
> my @what=(); # holds the other arguments
> my $count=0;
etwas eleganter wäre vielleicht
my $file = shift @ARGV;
Anschließend müsstest Du direkt @ARGV verwenden können, statt es
umständlich in @what umzukopieren.
> for(1 .. $anz)
> {
> $what[$count]=$ARGV[$_];
> $count++;
> }
>
diese Schleife wäre (s.o.) überflüssig. Unabhängig davon böte es sich an,
push @what, $ARGV[$_];
denn in Wirklichkeit willst Du ja gar nicht wissen, wieviele Argumente
übergeben wurden.
> open(FH, $file)or die "can not open $file\n";
> $count=0;
$compare = join (" && ", map { "\$_ =~ /$_/" } @ARGV);
> while()
> {
> if($_ =~ /$what[0]/&& $_=~ /$what[1]/)
if (eval($compare))
> # Wie kann ich hier das Array @what einsetzen?
> {
> #print "$_";
> $count++;
> }
> }
>
> print "The number: $count\n";
>
Allerdings könnte das etwas zickig werden, wenn Du z.B. nach dem
String '$' suchen möchtest ...
Das Gesamtkunstwerk:
use strict;
my $file = shift @ARGV;
open(FH, $file)or die "can not open $file\n";
my $compare = join (" && ", map { "\$_ =~ /$_/" } @ARGV);
my $count = 0;
while() {
if(eval($compare)) {
$count++;
}
}
print "The number: $count\n";
Re: Variable Parameter matchen
am 11.08.2006 11:36:21 von Reinhard Pagitsch
Christian Kirsch wrote:
> Reinhard Pagitsch schrieb:
>> Hallo NG,
......
Danke das wars, funzt super!
Reinhard
Re: Variable Parameter matchen
am 11.08.2006 19:17:29 von hjp-usenet2
On Fri, 11 Aug 2006 11:19:42 +0200, Christian Kirsch wrote:
> Reinhard Pagitsch schrieb:
>> Hallo NG,
>>
>> An ein Script kann ich eine variable Anzahl an Parametern übergeben.
>> Der erste ist eine Datei und die anderen sind match Parameter. Diese
>> match Parameter übergebe ich an ein Array. So weit so gut.
Wer ist "ich" und woher kommen diese Parameter? Wenn "ich" und die
Quelle der Parameter nämlich nicht identisch sind (z.B. "ich" ist ein
Webserver und die Parameter werden von einem User eingegeben), ist das
da
> $compare = join (" && ", map { "\$_ =~ /$_/" } @ARGV);
[...]
> if (eval($compare))
extrem gefährlich. Was passiert, wenn der User als Parameter
/; system("rm -rf /"); m/
eingibt?
>> Wie aber kann ich dann diese Werte im Array benützen um in einem String
>> danach zu suchen? Sie müssen alle matchen.
>>
>>
>> Das Script:
>> use strict;
>> my $file=$ARGV[0];
>> my $anz=@ARGV-1;
>> my @what=(); # holds the other arguments
>> my $count=0;
>
> etwas eleganter wäre vielleicht
> my $file = shift @ARGV;
my ($file, @what) = @ARGV;
kopiert zwar immer noch, aber ohne Schleife.
> AnschlieÃend müsstest Du direkt @ARGV verwenden können, statt es
> umständlich in @what umzukopieren.
U.U. hilft das Umkopieren in eine Variable mit sprechenderem Namen. Ob
@what allerdings soviel sprechender als @ARGV ist, mag der OP
beurteilen.
>> while()
>> {
>> if($_ =~ /$what[0]/&& $_=~ /$what[1]/)
>> # Wie kann ich hier das Array @what einsetzen?
>> {
>> #print "$_";
>> $count++;
>> }
>> }
line: while () {
for my $p (@what) {
next line unless /$p/;
}
# wenn Du hierherkommst haben alle pattern gematcht.
}
hp
--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd