Permalänk

[Perl] Gämnföra strängar?

Jag har börjat scripta lite på ett script till OpenDCHub för att lära mig lite grunder i Perl, men jag kör fast när jag försöker gämnföra två strängar.

$foo = '[Foo]'; $bar = '[Boo]'; if($foo =~ $bar) { odch::data_to_all("<$botname> FooBar|"); }

Perl säger att den if-satsen är sann, vilket jag inte tycker att den är. Om jag tar bort klammrarna så att $foo='Foo' och $bar='Boo' fungerar det som jag vill, men med klammrarna fungerar det. Jag har kollat igenom all dokumentation jag hittade på perl.org men inte hittat något som går igenom hur if-satserna fungerar (en eloge till PHP-dokumentationen som verkligen går igenom språket in i minsta detalj, vilket man verkligen inte kan säga om Perls dokumentation).

Så, någon swecare som är haj på perl som vill hjälpa till?

Visa signatur

"to conquer others is to have power, to conquer yourself is to know the way"

Permalänk
Medlem

Om jag inte missminner mig så apllicerar man en regexp med =~
Prova med if($foo == $bar) istället.

Eller kortare:
odch::data_to_all("<$botname> FooBar|") if ($foo == $bar);

Visa signatur

NAT och FTP borde få ett pannskott och släpas ut i skogen för att mata älgarna med.

Permalänk
Citat:

Ursprungligen inskrivet av Ogun
Om jag inte missminner mig så apllicerar man en regexp med =~
Prova med if($foo == $bar) istället.

Eller kortare:
odch::data_to_all("<$botname> FooBar|") if ($foo == $bar);

Kan nog säga att man applicerar regexp med =~, är som sagt inte så haj på Perl. Men $foo==$bar fungerar inte heller (har testat den innan och testade den nu igen med samma resultat), denn satsen blir alltid sann.

Visa signatur

"to conquer others is to have power, to conquer yourself is to know the way"

Permalänk
Medlem

D-oh.. == är ju binär jämförelse. Urgha, det var för länge sedan nu.
Nå, detta funkar men det finns säkert bättre sätt också:

$foo = '[Foo]'; $bar = '[Foo]'; if($foo =~ quotemeta($bar)) { print "True\n"; }

Visa signatur

NAT och FTP borde få ett pannskott och släpas ut i skogen för att mata älgarna med.

Permalänk

Det fungerar exemplariskt, jag tackar så hjärtligt för hjälpen Jag skulle aldrig ha lyckats med det själv, Perl är lite lagom skumt på en del punkter

Visa signatur

"to conquer others is to have power, to conquer yourself is to know the way"

Permalänk
Medlem

Som jag har fattat av det jag nu läst i lite pearl manualer, så ska man skriva

if($foo eq $bar)

för jämföring av strängar.
vetefasen om det är rätt dock..

Men du har ju redan en fungerande lösning nu, så det spelar ju kanske ingen roll

Visa signatur

The difference between stupidity and genius - the latter has limits

Permalänk

Strängar skall alltid jämföras med eq, inget annat. Andra metoder kan generera fel svar och andra fulheter om jag inte minns fel från det jag läst i olika forum.

$foo = '[Foo]'; $bar = '[Boo]'; odch::data_to_all("<$botname> FooBar|") if ($foo eq $bar);

Bara så att folk vet

Visa signatur

RTFM - vacker sak att säga till folk som ställer dumma frågor

Permalänk

$foo = '[Foo]'; $bar = '[Boo]'; if($foo =~ $bar) //osv

När du skriver så här tolkar Perl det som om du vill söka i strängen $foo med regexp $bar. Det fullständiga uttrycket är $foo =~ m/$bar/. När du har hakparanteser i ett regexp tolkar Perl det som om den skall hitta en av bokstäverna innanför. På svenska blir det "Om $foo innehåller minst ett B eller minst ett o skall nästa rad köras". Bevisligen innehåller strängen '[Foo]' minst ett o.