Variable Parameter matchen

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= [at] ARGV-1;
my [at] 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(<FH>)
{
if($_ =~ /$what[0]/&& $_=~ /$what[1]/)
# Wie kann ich hier das Array [at] 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.
Reinhard Pagitsch [ Fr, 11 August 2006 10:37 ] [ ID #1427228 ]

Re: Variable Parameter matchen

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= [at] ARGV-1;
> my [at] what=(); # holds the other arguments
> my $count=0;

etwas eleganter wäre vielleicht
my $file = shift [at] ARGV;

Anschließend müsstest Du direkt [at] ARGV verwenden können, statt es
umständlich in [at] 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 [at] 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 { "\$_ =~ /$_/" } [at] ARGV);

> while(<FH>)
> {
> if($_ =~ /$what[0]/&& $_=~ /$what[1]/)

if (eval($compare))

> # Wie kann ich hier das Array [at] 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 [at] ARGV;

open(FH, $file)or die "can not open $file\n";
my $compare = join (" && ", map { "\$_ =~ /$_/" } [at] ARGV);
my $count = 0;
while(<FH>) {
if(eval($compare)) {
$count++;
}
}

print "The number: $count\n";
Christian Kirsch [ Fr, 11 August 2006 11:19 ] [ ID #1427229 ]

Re: Variable Parameter matchen

Christian Kirsch wrote:

> Reinhard Pagitsch schrieb:
>> Hallo NG,
......

Danke das wars, funzt super!

Reinhard
Reinhard Pagitsch [ Fr, 11 August 2006 11:36 ] [ ID #1427230 ]

Re: Variable Parameter matchen

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 { "\$_ =~ /$_/" } [at] 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= [at] ARGV-1;
>> my [at] what=(); # holds the other arguments
>> my $count=0;
>
> etwas eleganter wäre vielleicht
> my $file = shift [at] ARGV;

my ($file, [at] what) = [at] ARGV;

kopiert zwar immer noch, aber ohne Schleife.

> Anschließend müsstest Du direkt [at] ARGV verwenden können, statt es
> umständlich in [at] what umzukopieren.

U.U. hilft das Umkopieren in eine Variable mit sprechenderem Namen. Ob
[at] what allerdings soviel sprechender als [at] ARGV ist, mag der OP
beurteilen.

>> while(<FH>)
>> {
>> if($_ =~ /$what[0]/&& $_=~ /$what[1]/)
>> # Wie kann ich hier das Array [at] what einsetzen?
>> {
>> #print "$_";
>> $count++;
>> }
>> }

line: while (<FH>) {
for my $p ( [at] 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 [at] hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd
hjp-usenet2 [ Fr, 11 August 2006 19:17 ] [ ID #1427237 ]
Perl » de.comp.lang.perl.misc » Variable Parameter matchen

Vorheriges Thema: Module-Grundausstattung
Nächstes Thema: Umfrage: Einrichtung der deutschsprachigen Ruby-Newsgroup (de.comp.lang.ruby)