http://www.perlmonks.org?node_id=1233650


in reply to How to match last character of string, even if it happens to be a newline?

That's what you want? :)
$ perl -e' m/.*(.|\n)/,print "<$1>" for "123","ab\ c\n"' <3>< >$

Please note that \n is often not one but two characters, like on Unix CR LF

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

Replies are listed 'Best First'.
Re^2: How to match last character of string, even if it happens to be a newline?
by BillKSmith (Monsignor) on May 12, 2019 at 21:17 UTC
    Mac or Windows newlines seldom cause a problem. I think of \n as a perl newline. Perl strings always use it. Translation between it and your OS's representation is done by an I/O "layer". (In Unix, the "translation" does not actually change anything.) The only exception is when we change I/O behavior by specifying non-standard layers or binmode on input.
    Bill
      I didn't say it's a problem in general,

      I said it's not always just one character like the OP suggested.

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

        In Perl, "\n" is always one character, regardless of the platform. It is written as two bytes if you use the default encoding on some platforms, Windows being the most popular. Newline has a nice overview.

        If you read a file containing 0D0A using the default encoding on Unix platforms, or with binmode on any platform, you get two characters "\r\n" which you can (or have to) process.

Re^2: How to match last character of string, even if it happens to be a newline?
by Allasso (Monk) on May 12, 2019 at 15:58 UTC
    Not quite:
    $text_1 = "abc\nd"; $text_1 =~ m/.*(.|\n)/; print("----------\n>" . $1 . "<\n");
    Prints:
    ---------- > <
    Should print d
      $text_1 = "abc\nd";
      $text_1 =~ m/.*(.|\n)/;
      ...
      Should print d

      A narration of  m/.*(.|\n)/ might be:

      1. .* From the start of the string, grab as much as possible of anything that's not a newline (no /s modifier for dot);
      2. (.|\n) Then match and capture the first thing that's either not-a-newline or a newline.
      Looked at this way, the only thing that could possibly be captured in the given string would be a newline.

      Indeed, if your regex has no operator introduced after Perl version 5.6, this kind of narration is what YAPE::Regex::Explain will give you:

      c:\@Work\Perl\monks>perl -wMstrict -le "use YAPE::Regex::Explain; print YAPE::Regex::Explain->new(qr/.*(.|\n)/)->explain(); " The regular expression: (?-imsx:.*(.|\n)) matches as follows: NODE EXPLANATION ---------------------------------------------------------------------- (?-imsx: group, but do not capture (case-sensitive) (with ^ and $ matching normally) (with . not matching \n) (matching whitespace and # normally): ---------------------------------------------------------------------- .* any character except \n (0 or more times (matching the most amount possible)) ---------------------------------------------------------------------- ( group and capture to \1: ---------------------------------------------------------------------- . any character except \n ---------------------------------------------------------------------- | OR ---------------------------------------------------------------------- \n '\n' (newline) ---------------------------------------------------------------------- ) end of \1 ---------------------------------------------------------------------- ) end of grouping ----------------------------------------------------------------------
      (There are newer and better regex parser/explainers around, but I like this one, limited as it is, for its explanatory style.)


      Give a man a fish:  <%-{-{-{-<

      > Not quite: ... "abc\nd"

      in this case two options with /s modifier

      DB<11> m/.*(.|\n)/s,print "<$1>" for "123","abc\n","abc\nd" <3>< ><d> DB<12> m/.*(.)/s,print "<$1>" for "123","abc\n","abc\nd" <3>< ><d> DB<13>

      HTH!

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery FootballPerl is like chess, only without the dice