Smylers writes: > Piers Cawley writes: > > > Stèphane Payrard <[EMAIL PROTECTED]> writes: > > > > > s/// in string context should return the string after substituion. > > > > Surely it should return the string after substitution, but with an > > appropriate 'but true' or 'but false' property depending on whether > > anything was substituted. > > Perl 5 C<s///g> currently returns the number of substitutions made. > This has its uses, so Perl 6 C<s:e///> should probably continue to do > this. > > Can we have a return value that stringifies to the result of the > substitution but numifies to the number of substitutions made and > boolifies based on the number rather than the string (to allow for > situations such as a successful substitution producing an empty string)? > > Would we want that anyway? It means there's a difference between: > > $substituted = $text ~~ s/$pattern/$replacement/; > if $substituted > > and: > > if $text ~~ s/$pattern/$replacement/ > > which doesn't sound like a great feature to leave lying around in a > language.
Probably wouldn't want that. But returning the text substituted isn't necessarily a bad idea, especially if it has a C<but true> on it. As long as there's a way to strip boolifying properties en passant. $substituted = ($text ~~ s/$pattern/$replacement/) but nothing; Seems rather authoritative, doesn't it? :-) What I really want is a functional version of s///. Like: my $substituted = $text.s(/$pattern/, { $replacement }); Without modifying $text. Luke > Thinking about this some more, I'm not convinced about Stèphane's claim. > Is it useful to return the substituted string? We already have the > substituted string in one variable (C<s///> doesn't work on a constant), so > what's the point in having it in a second one? > > Often I want to modify a string and leave the _original_ behind in a > separate variable: > > (my $modified = $original) ~~ s/$pattern/$replacement/; > > but that's different, because the two variables end up with > (potentially) different contents rather than always being duplicates. > > This, however, is irritating: > > my @new = map { s:e/$pattern/$replacement/; $_ } @old; > > I forget the C<; $_> far more often than I like to admit and end up with > an array of integers instead of modified strings. So I'd like a more > elegant way of writing that -- but I don't think making the return value > of C<s///> more complicated (and duplicating data in the process) would > be a nett gain. > > It seems that the substituted text is needed only either in the original > variable or somewhere else, but not both. A variant of C<s///> which > did not modify the original but did return the modified string could > have some use. That'd allow things such as: > > my $modified = $original ~~ ss/$pattern/$replacement/; > > my @new = map { ss:e/$pattern/$replacement/ } @old; > > except that C<ss///> is obviously a lousy name for such an operator. > I've no idea what a good name would be for distinguishing between > 'modify yourself in this way and return how many times you did it' and > 'return a copy of yourself modified in this way'; I fear that it'd be > too easy to get these confused and do the wrong thing.[*0] > > Having an operator that substitutes and returns the modified string > would certainly have its uses, but unless a way can be found of doing > this which doesn't make other things worse, we'd just be rearranging the > inconveniences and introducing new pitfalls; on balance I think I'd > rather keep the pitfalls that I'm already used to avoiding than fix > those but have to learn about new ones. > > [*0] I suppose it could be seen as analogous to the difference > between C<$count + 2> and C<$count += 2>. So maybe that's a precedent > for such distinctions and it wouldn't be that confusing after all > (C<~~> and C<~~=> anybody?). Or maybe the fact that learners often > get those different sorts of addition confused is a reason for not > going any further along this route and making matters worse. > > Smylers >