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

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?

Replies are listed 'Best First'.
Re^9: Using pos() inside regexp (no /e)
by andal (Hermit) on Oct 14, 2010 at 10:03 UTC
    What's the difference? The change does not have any effect on the matching. So it is the same as not working at all. After your matching ends, the set value won't even be preserved. So, for the original question "Can pos() be used inside of matching to change where the \G matches" the answer is "No. The pos does not work during matching. In other words, it does not affect the position where the \G matches". And this should be written in the documentation.

      So, for the original question "Can pos() be used inside of matching to change where the \G matches" the answer is "No. The pos does not work during matching.

      \G can only possibly match where you left off. (Not processing part of the input string or processing part of the input string twice makes no sense.) Since \G can't possibly match elsewhere, trying to make it do so would result in a pattern that would never match.

      So no, the answer is "No, it makes no sense".

      The change does not have any effect on the matching. So it is the same as not working at all.

      No, it means you think s/// or \G is broken, not pos(). But s/// and \G aren't broken.

        No, it means you think s/// or \G is broken, not pos(). But s/// and \G aren't broken.

        Are you sure you know what I think? :^) I didn't say anything about "broken". I just say, that the function does not work as documented and propose to change the documentation to avoid the long arguments like this.

        One more time. The perldoc -f pos states 'so assigning to "pos" will change that offset, and so will also influence the "\G" zero-width assertion in regular expressions'. In reality, when pos is used during matching it does not influence the "\G". Which means that the documentation is incorrect. If you believe, that pos does influence the \G during matching, then please provide a proof. If you just don't like the words that I've used to state this, then I don't think it makes sense to argue :)