Toon posts:

[Perl] regexp resultaat als input voor andere functie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een vraagje over perl, waar ik op google geen resultaten voor kan vinden omdat ik gewoon niet weet hoe ik het moet zeggen. Er zullen vast genoeg antwoorden zijn, maar ik weet niet hoe ik dit moet noemen:

ik heb de volgende eenvoudige code:
code:
1
2
3
4
5
6
7
8
9
10
11
sub bla{
  print $_[0];
  print $_[1];
}

$txt1="hoi";
$txt2="doei";
bla(
$txt1,
$txt2
);


nu wil ik dat er in $txt1 en $txt2 geen letter 'o' meer kan voorkomen. Dus wat ik heb geprobeerd:
code:
1
2
3
4
5
6
7
8
9
10
11
sub bla{
  print $_[0];
  print $_[1];
}

$txt1="hoi";
$txt2="doei";
bla(
$txt1 =~ s/o//g,
$txt2 =~ s/o//g
);

dat geeft helaas geen gewijzigde strings door, maar het aantal gewijzigde characters.

Iets anders wat ik heb geprobeerd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sub repl{
  $in=$_;
  $in=~s/o//g;
  return $in;
}

sub bla{
  print $_[0];
  print $_[1];
}

$txt1="hoi";
$txt2="doei";
bla(
repl($txt1),
repl($txt2)
);

maar die maakt de output value van repl static, waardoor de output hier zou worden: "deidei".

Ik kan natuurlijk de vars een paar regels hoger find en replacen. Dat is op zich niet erg voor 1 regel, maar in het programma'tje wat ik nu maak zou dat dan 40 keer moeten. Teveel van het goede.

Hoe kan ik dit wel doen? Is er een naam voor zoiets, waarop google me wel resultaten had getoond?

Verwijderd

Okey, ik weet dus geen hol van Perl, maar werkt onderstaande code ook niet?

code:
1
2
3
4
5
6
7
8
9
10
11
sub bla{
  print $_[0];
  print $_[1];
}

$txt1="hoi";
$txt1 =~ s/o//i;
$txt2="doei";
$txt2 =~ s/o//i;

bla($txt1, $txt2);

Verwijderd

Topicstarter
Verwijderd schreef op 15 juli 2004 @ 14:53:
Okey, ik weet dus geen hol van Perl, maar werkt onderstaande code ook niet?

code:
1
2
3
4
5
6
7
8
9
10
11
sub bla{
  print $_[0];
  print $_[1];
}

$txt1="hoi";
$txt1 =~ s/o//i;
$txt2="doei";
$txt2 =~ s/o//i;

bla($txt1, $txt2);
ja, dat werkt dus wel, maar dat is helaas zo'n rommel als je 40 x onder elkaar een regexp heb staan. Dat moet toch netter kunnen?

Verwijderd

Die /g operator snap ik niet helemaal...

Dan zou onderstaande code toch ook moeten werken?

code:
1
2
3
4
5
6
7
8
9
10
sub bla{
  print $_[0];
  print $_[1];
}

$txt1="hoi";
$txt2="doei";

bla($txt1 =~ s/o//i, $txt2 =~ s/o//i);
// bla(($txt1 =~ s/o//i), ($txt2 =~ s/o//i));


Als dat niet werkt, probeer eens ronde haken om de attributen te zetten.

Verwijderd

Topicstarter
Verwijderd schreef op 15 juli 2004 @ 15:03:
Die /g operator snap ik niet helemaal...
/g betekent all instances.
dus:
"hoooooi" =~ s/o//g -> "hi"
"hoooooi" =~ s/o//g -> "hooooi" (slechts 1 o minder)
Dan zou onderstaande code toch ook moeten werken?

code:
1
2
3
4
5
6
7
8
9
10
sub bla{
  print $_[0];
  print $_[1];
}

$txt1="hoi";
$txt2="doei";

bla($txt1 =~ s/o//i, $txt2 =~ s/o//i);
// bla(($txt1 =~ s/o//i), ($txt2 =~ s/o//i));


Als dat niet werkt, probeer eens ronde haken om de attributen te zetten.
nee, dat werkt niet. Als parameters wordt dan doorgestuurd hoe vaak de operatie uitgevoerd kon worden, een integer ipv de string die ik wil.

Verwijderd

Wat dacht je dan van:

code:
1
2
3
4
5
6
7
8
9
10
11
sub bla{
  $_[0] =~ s/o//gi;
  $_[1] =~ s/o//gi;
  print $_[0];
  print $_[1];
}

$txt1="hoi";
$txt2="doei";

bla($txt1, $txt2);

Verwijderd

Topicstarter
Verwijderd schreef op 15 juli 2004 @ 15:11:
Wat dacht je dan van:

code:
1
2
3
4
5
6
7
8
9
10
11
sub bla{
  $_[0] =~ s/o//gi;
  $_[1] =~ s/o//gi;
  print $_[0];
  print $_[1];
}

$txt1="hoi";
$txt2="doei";

bla($txt1, $txt2);
nope
wat ik gewoon wil kunnen, is zoals in php

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function bla($val1,$val2){
  print $val1;
  print $valr;
}

$txt1="hoi";
$txt2="doei";

bla(
preg_replace('/o/','',$txt1),
preg_replace('/o/','',$txt2)
);


da's toch veel mooier?

  • bartware
  • Registratie: Juni 2001
  • Laatst online: 25-03-2023

bartware

@jabber.org

Tja, helaas voor jou retourneert de matching/replacing het aantal dat is replaced:
s/PATTERN/REPLACEMENT/egimosx
Searches a string for a pattern, and if found, replaces that pattern with the replacement text and returns the number of substitutions made. Otherwise it returns false (specifically, the empty string).
Je vars worden dus wel aangepast. Doe maar eens een print van je vars, na de aanroep van bla.

Of jouw wens mogelijk is weet ik niet (:P) , maar ik ga eens wat proberen.

edit:
Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$txt1="hoi";
$txt2="doei";
bla(
    repl($txt1),
    repl($txt2)
);


sub repl{
  my($in)=@_;  # <-----
  $in=~s/o//g;
  return $in;
}

sub bla{
  print $_[0];
  print $_[1];
}


Om die var $in lokaal binnen repl() te houden moet je wel my gebruiken.
Eigenlijk moet je altijd my gebruiken, om mixups met lokale en globale variabelen te voorkomen.

[ Voor 29% gewijzigd door bartware op 15-07-2004 18:01 . Reden: oplossing.... ]

Heb ik me begrepen?
Cycle Vision 2020: 17-20 juli Sportpark Sloten & Wheelerplanet Spaarnwoude


  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

tr/// of s/// zal nooit gaan werken, aangezien je in de parameters de return-waarde van de substitution terugkrijgt. Dat is dus niet de string, maar het aantal substitutions (man perlrequick).

Als je dus NA de functieaanroep kijkt naar de waardes van je strings, dan zullen die ongetwijfeld veranderd zijn.

Ik weet trouwens niet waarom dat je repl-functie niet werkt, want bij mij werkt ie wel (perl -v: perl v5.8.4).

code:
1
2
3
4
5
6
7
8
sub repl {
  $str = shift;    # Geen $_ !
  $str =~ s/o//g;   # verander string, return-variabele vragen we niet eens op.

  return $str;
}

bla ( repl ($txt1), repl ($txt2));


Ik krijg hier gewoon "hidei" uit...

Waarom kan je trouwens niet de strings transformeren in de bla() functie?

Yo dawg, I heard you like posts so I posted below your post so you can post again.

Pagina: 1