Front page | perl.beginners |
Postings from February 2012
Re: stopping global substituion under MACOSX
Thread Previous
|
Thread Next
From:
timothy adigun
Date:
February 22, 2012 11:56
Subject:
Re: stopping global substituion under MACOSX
Message ID:
CAEWzkh6X_PZRiJJZE+j6V_ErotWudH6r-a9S9xSZVSAV1CFuQg@mail.gmail.com
Hi,
On Wed, Feb 22, 2012 at 4:45 PM, Jim Gibson <jimsgibson@gmail.com> wrote:
> At 9:02 AM +0100 2/22/12, timothy adigun wrote:
>
>> On Wed, Feb 22, 2012 at 3:43 AM, John W. Krahn <jwkrahn@shaw.ca> wrote:
>> > sb@missionstclare.com wrote:
>> >
>>
>>> The line
>>>
>>>>
>>>> $text=~s/george/tim/;
>>>>
>>>> causes a global substituion of "george" with "tim"
>>>> How can I limit the substituion to the first instance only?
>>>>
>>>
>>> Global substitution only works if you use the /g option but your example
>>> does not use the /g option so it will only replace the first 'george' it
>>> finds.
>>>
>>>
>>>
>> Correct, but sometimes this doesn't work all of the time, especially
>> with some very funny text files.
>>
>
> Could you please provide an example of where the given regular expression
> fails to substitute only the first instance of the matched pattern?
>
>
> So, if John suggestion doesn't work as it should, then you may have to
>> enable slurp mode like this:
>> $/=undef or local $/;
>> So your code could read:
>>
>> {
>> .....
>> $/=undef; ## or use local $/;
>> $text=~s/george/tim/;
>> ........
>> }
>>
>
>
> Setting $/ will not affect the results of the substitution. It will affect
> reading a file, but you are not reading a file within the scope of the
> modified $/ variable.
>
>
Why Not? If your while(<>){...} is within the scope of { local $/;
....}, atleast that is what am suggesting.
> You can use the File::Slurp module to read a file into a scalar variable.
> Also check out 'perldoc -q entire' "How can I read an entire file all at
> once?"
>
> Please, I don't mean to sound arrogant, but 'perldoc -q entire' "How
can I read an entire file all at once?" add nothing to me, because all
brian d foy mentioned is what I think any serious Perl programmer should
know.
Agreed File::Slurp will be faster and better as Uri mentioned.
>
>
>> You could check *perldoc perlvar* for more information.
>>
>
> We don't know if the original poster was applying the substitution to an
> entire file or to each line in a file. We don't even know if sb was even
> working with files at all.
>
True, but atleast we know if the 'original poster' didn't have this
problem he won't be asking. Will he?
And if I haven't seen something 'like' that before, I won't be stating it.
All I did, when **s/college/SCHOOL/;** wouldn't work was:
{
local $/;
while(<>){
.......
s/college/SCHOOL/;
........
}
}
Bingo! The job was done!
--
Tim
Thread Previous
|
Thread Next