"LC Geldenhuys" <lcgeldenhuys / hotmail.com> schrieb im Newsbeitrag
news:s26430l9o2e34veibgqpc76kvvnn67ras1 / 4ax.com...
> On Tue, 17 Feb 2004 18:04:00 +0900, Emmanuel Touzery
> <emmanuel.touzery / wanadoo.fr> wrote:
>
> >LC Geldenhuys wrote:
> >
> >>Hi,
> >>
> >>I am new to Ruby. I'm trying to get some Ruby scripts going to manage
> >>or CVS log message emails. (I haven't written them myself, got them
> >>from the web.)
> >>
> >>I get:
> >>/home/cvs/repository/CVSROOT/commitinfo.rb:26:in `tr_s!': can't modify
> >>frozen string (TypeError)
> >>        from /home/cvs/repository/CVSROOT/commitinfo.rb:26
> >>
> >>I've done some reading, and I suspect I understand what the frozen
> >>string issue is about. The problem is, I don't see how/why this string
> >>is frozen? Here is the relevant code snippet:
> >>
> >>-----------------------------------
> >>if ARGV.size < 4
> >>  puts "Usage: #{$0} CVSROOT USER modulepath file1 [file2...]"
> >>  exit 1 # No way!
> >>end
> >>
> >>$cvsroot, $cvsuser, $modulepath, *$cvsfiles = *ARGV
> >>
> >>$cvsroot.tr_s!('/', '/')
> >>$modulepath.tr_s!('/', '/')
> >>-----------------------------------
> >>
> >>The two lines using 'tr_s!' causes the problem, but I don't see
> >>how/why $cvsroot or $modulepath is 'frozen'? Might it be due to the
> >>fact that they are passed to the script, i.e. some global/local scope
> >>issue?
> >>
> >>
> >you can't modify values in ARGV. you have to copy the values.
> >
> >
>
> Thanks, the following now seems to work.
>
> $cvsroot_in, $cvsuser, $modulepath_in, *$cvsfiles = *ARGV
>
> $cvsroot = $cvsroot_in.dup
> $modulepath = $modulepath_in.dup
>
> $cvsroot.tr_s!('/', '/')
> $modulepath.tr_s!('/', '/')

Why don't you just do

$cvsroot_in, $cvsuser, $modulepath_in, *$cvsfiles = *ARGV

$cvsroot.tr_s('/', '/')
$modulepath.tr_s('/', '/')

?  And, why do you use global variables at all?

Regards

    robert