in reply to Re^4: Using pos() inside regexp (no /e)
in thread Using pos() inside regexp

Well, I guess here we talk about 2 different "pos()" functions. The one that is documented under "perldoc -f pos" allows modification of the position where the match has ended. The one you have mentioned, and the one that is used in substitute part of s/// are read-only functions. They can not be used to modify the position. Just the name of the function is the same, but functionality is different.
  • Comment on Re^5: Using pos() inside regexp (no /e)

Replies are listed 'Best First'.
Re^6: Using pos() inside regexp (no /e)
by ikegami (Patriarch) on Oct 12, 2010 at 15:25 UTC

    There isn't two functions with the same name. (That doesn't even make sense.) It's not read-only.

    s/// uses the specified position when it starts matching (not in the middle), and only for \G. As mentioned by someone else, it makes no sense to modify the pos s/// uses in the middle of its operation.

    If you want to move pos back, you would want to the input with one thing, then replace it again with something else. Replace it with the right thing the first time.

    If you want to move pos forward, s/// has no way to know what you want to do with the chunk you're skipping over. Should it be copied? Should it be replaced?

      I understand your arguments. But the point is simple. Using "pos() = $new_pos" does not work during the matching process. So either the "perldoc -f pos" has to be updated, or the function available during matching should be renamed. Of course, more appropriate is to update the description of "pos" function. This way we wouldn't need to argue about what makes sense and what does not. Everything would be nice and clear. The update of the last match position is possible only outside of matching. This is exactly what I meant in my first message.

        Using "pos() = $new_pos" does not work during the matching process.

        That is also wrong. pos works in a substitution expression just like it does outside a substitution expression. Had you checked, you would have seen that lvalue pos does in fact change the var's pos when used in the substitution expression.

        $ perl -E'my $x="abc"; $x=~s/./say pos($x); pos($x)=2; say pos($x)/e;' 0 2

        s/// simply doesn't care that you changed it. Like I've already explained, it simply doesn't make any sense for s/// to check if the string's pos has changed. Why are you still asking about this?