/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Fjern substring fra en streng
Fra : Martin Kofoed


Dato : 10-01-03 13:35

Hej perl.nørder! :)

Jeg er ikke så velbevandret i Perl endnu, og sidder med en stump Open
Source, som jeg godt kunne tænke mig at rette lidt i. Helt præcist drejer
det sig om nedenstående udsnit fra Majordomo's resend-modul:

===

if ( (/^subject:\s*/i)
&& ($config_opts{$opt_l,"subject_prefix"} ne '')) {

print STDERR "$0: parse_header: adding subject prefix\n" if $DEBUG;
local($foo) =
&config'substitute_values($config_opts{$opt_l,"subject_prefix"}, $opt_l);#';
local($foo_pat) = $foo;
$foo_pat =~ s/(\W)/\\$1/g;
s/^subject:[^\S\n]*/Subject: $foo /i if !/$foo_pat/;
}

===

Hvad det gør, er at prepende et subject prefix til en e-mails subject.
Problemet er bare, at hvis dette prefix allerede ER i strengen, gøres der
så vidt jeg kan se intet. Det betyder i praksis at subject prefix ikke
altid vil stå som det første ved quotede mails ("Re:", "Sv:" osv.).

Det kan løses ved at fjerne alle forekomster af subject prefix fra strengen
FØR behandling i ovenstående algoritme, men der er sikkert også en
snedigere løsning (nemlig at rette i ovenstående regexp's). Det er sådan
ca. her min viden giver op. ;) Kan nogen af jer hjælpe lidt?

--

Martin

 
 
Peter Makholm (10-01-2003)
Kommentar
Fra : Peter Makholm


Dato : 10-01-03 14:08

Martin Kofoed <inzide@hot.mail.c.o.m> writes:

> if ( (/^subject:\s*/i)
> && ($config_opts{$opt_l,"subject_prefix"} ne '')) {
>
> print STDERR "$0: parse_header: adding subject prefix\n" if $DEBUG;
> local($foo) =
> &config'substitute_values($config_opts{$opt_l,"subject_prefix"}, $opt_l);#';
> local($foo_pat) = $foo;
> $foo_pat =~ s/(\W)/\\$1/g;

Mon ikke det er nok bare at indsætte en linje her der siger:

s/$foo_pat//g;

> s/^subject:[^\S\n]*/Subject: $foo /i if !/$foo_pat/;

Og så fjerne 'if !/$foo_pat/' fra denne linje. (ikke nødvendigt men
pænere)

> }


(Dermed ikke sagt at det er smart at gøre, men det ligger uden for
gruppens emne at diskuterer)

--
Peter Makholm | 'Cause suicide is painless
peter@makholm.net | It brings on many changes
http://hacking.dk | And I can take or leave it if I please
| -- Suicide is painless

Martin Kofoed (11-01-2003)
Kommentar
Fra : Martin Kofoed


Dato : 11-01-03 11:48

Peter Makholm wrote:

> Mon ikke det er nok bare at indsætte en linje her der siger:
> s/$foo_pat//g;

Med dine forslag virker det i hvert fald efter hensigten. Tak for hjælpen!

Men for lige at lære lidt af det også, kan du så forklare, hvad det er, du
gør? Du substituter $foo_pat således at den bliver tom. Forinden er
$foo_pat blevet sat til det samme som $foo, som (så vidt jeg kan se) ikke
er hele subject-linien, men blot selve prefix'et? Der hvor kæden hopper af
for mig, er disse tre linier, hvoraf den sidste var din tilføjelse:

$foo_pat =~ s/(\W)/\\$1/g;
s/$foo_pat//g;
s/^subject:[^\S\n]*/Subject: $foo /i;

Jeg har svært ved at se koblingen mellem subject, som det så ud på den
oprindelige mail, og slutresultatet. Der må være en del implicit magi ét
eller andet sted for at få det til at hænge sammen?


--

Martin

Peter Makholm (11-01-2003)
Kommentar
Fra : Peter Makholm


Dato : 11-01-03 12:01

Martin Kofoed <inzide@hot.mail.c.o.m> writes:

$foo_pat er her det samme som $foo der igen er det tag du vil have på
maillinglisten.

> $foo_pat =~ s/(\W)/\\$1/g;

Alle tegn i $foo_pat der ikke er bogstaver, for sat en \ foran. Hvis
$foo_pat før var "[FOO-DK]" er den bagefter "\[FOO\-DK\]".

> s/$foo_pat//g;

$foo_pat bruges nu som patern i en substitution. I ovenstående
eksempel er det ækvivalent til at skrive

s/\[FOO\-DK\]//g

Det gør at hver gang der står "[FOO-DK]" i $_ bliver det erstattet med
ingenting, altså slettet. Grunden til at indsætte backslasher i
$foo_pat er at blandt andet ['er ellers har en speciel betydning.

> s/^subject:[^\S\n]*/Subject: $foo /i;

Og her indsætter vi så $foo (som jo er "[FOO-DK]) et passende sted i
subject-linjen.

--
Peter Makholm | I congratulate you. Happy goldfish bowl to you, to
peter@makholm.net | me, to everyone, and may each of you fry in hell
http://hacking.dk | forever
| -- The Dead Past

Lars Balker Rasmusse~ (11-01-2003)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 11-01-03 13:48

Peter Makholm <peter@makholm.net> writes:
> $foo_pat er her det samme som $foo der igen er det tag du vil have på
> maillinglisten.
>
> > $foo_pat =~ s/(\W)/\\$1/g;
>
> Alle tegn i $foo_pat der ikke er bogstaver, for sat en \ foran. Hvis
> $foo_pat før var "[FOO-DK]" er den bagefter "\[FOO\-DK\]".

Og den rigtige måde at gøre den slags på nu om dage er:

$foo_pat = "\Q$foo\E";
--
Lars Balker Rasmussen                  "S.M.R.T."

Dennis Haney (16-01-2003)
Kommentar
Fra : Dennis Haney


Dato : 16-01-03 12:32

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Lars Balker Rasmussen <lars@balker.org> writes:

> Peter Makholm <peter@makholm.net> writes:
>> $foo_pat er her det samme som $foo der igen er det tag du vil have på
>> maillinglisten.
>>
>> > $foo_pat =~ s/(\W)/\\$1/g;
>>
>> Alle tegn i $foo_pat der ikke er bogstaver, for sat en \ foran. Hvis
>> $foo_pat før var "[FOO-DK]" er den bagefter "\[FOO\-DK\]".
>
> Og den rigtige måde at gøre den slags på nu om dage er:
>
> $foo_pat = "\Q$foo\E";

eller
$foo_pat = quotemeta($foo_pat);

- --
Dennis
I have always thought explanations were overkill when correcting
mistakes. A simple "that's wrong" must suffice. I mean, people are
always aware why they are wrong. They just make mistakes to annoy you.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: Processed by Mailcrypt 3.5.8 <http://mailcrypt.sourceforge.net/>

iD8DBQE+Jpgbo6hqeoa8JFgRAiGAAKCkWlemujHE10Q1amc+DMo0zfV7gwCgm9Tn
xZcGUOLrv0UCTeHOTbnB6oM=
=7mr9
-----END PGP SIGNATURE-----

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste