On Tue, Mar 02, 2010 at 10:58:35AM -0500, Daniel V Klein wrote: >Speaking just for myself (and not cfengine today), I think this is a good idea.
That's good to hear--there's at least one other crazy person here! :-) >As long as you're at it, you probably want a tolower() and toupper() function. And, left(), right(), substr(), length(), sprintf(), s///, and others. >You can get "ignore case" on regular expression matching with PCRE '(?i)', >but converting to lower or to upper on output is harder (and if you want >convergence, you DON'T want what Perl does... :-) There are lots of things where I don't want what Perl does. :) But along the lines of convergence, I don't see that a regreplace type of function is any more or less convergent than splitstring() or join(). Both of those existing functions take existing variables and create a new variable while leaving the original(s) untouched. >Also, in your model, regreplace needs a 4th argument - "first" or "all", to >give you the equivalent of /g substitution. While "first" can be a bad >thing, there is already precendent for that in Cfengine in the replacement of >lines in files... Agreed, a first/all argument is needed. > >-Dan > >> On Tue, Mar 02, 2010 at 08:33:15AM -0500, nwat...@symcor.com wrote: >> >I don't think there is a function at present for string search a replace >> >actions out side of file editing. Perhaps look at it from a higher level. >> > Why is string manipulation needed? >> >> There are two reasons, one specific, and one general. >> >> The specific reason is that I am trying to build a somewhat more robust >> template library (which if I ever get to work, I will post to the list). >> >> To do this, I am trying to convert a file from the form of >> "/some/path/to/file" into something like >> "/path/to/repo/_some_path_to_file". >> >> This is trivial with two regexes. Using quasi-cfengine notation, and >> a hypothetical regreplace(string,find,replace) function, something like >> this would work: >> >> vars: >> "orig" = "/some/path/to/file"; >> "new" = regreplace( >> regreplace("${orig}", "/", "_" ), >> "^", >> "/path/to/repo" >> ); >> >> >> >> The general reason is that string search and replace is a very useful >> tool. It doesn't really matter the what the specific problem actually >> is, since this is a more general issue. A good tool is useful in lots >> of different situations, including those in which it was not originally >> intended. >> >> There have been several occasions where a simple string replacement would >> make certain promises simpler, but I have attempted to work around them. >> But having to shell out and make two calls to outside binaries--one >> of them being echo!--just to do a simple string manipulation seems >> counter-productive, inefficient, and much more error prone (especially >> due to the hazards of shell quoting). >> >> Here's another example, albeit slightly contrived. You have a system >> where you want to start hashing user home directories in the form of >> "jbecker -> /home/j/jbecker" (for example). Based on some >> list of users, there is a set of promises to ensure that the accounts >> exist, including calling 'useradd'. Having a short set of promises to >> convert the string "jbecker" into "/home/j/jbecker" is fairly easy using >> a search and replace function. I can envision a situation where >> cfengine could actually handle the migration of existing "unhashed" user >> home directories to "hashed" ones, but only if it supports better string >> handling routines. >> >> Of course, one can always just hand off a username to a Perl script as >> well. >> >> I really want is a general solution (which is why I did not simply ask >> how to munge a path). Once I--and everyone else--has that, the >> specifics should be simple. :) >> >> >> >> -- >> Jesse Becker >> NHGRI Linux support (Digicon Contractor) >> _______________________________________________ >> Help-cfengine mailing list >> Help-cfengine@cfengine.org >> https://cfengine.org/mailman/listinfo/help-cfengine -- Jesse Becker NHGRI Linux support (Digicon Contractor) _______________________________________________ Help-cfengine mailing list Help-cfengine@cfengine.org https://cfengine.org/mailman/listinfo/help-cfengine