Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re: Function for reading file

by davido (Cardinal)
on Mar 25, 2020 at 15:15 UTC ( #11114641=note: print w/replies, xml ) Need Help??


in reply to Function for reading file

[A-Za-z\W] is a really strange regex. In an ASCII-only character set it will match every character except 0-9 and underscore (_). It may be exactly what you are after but it's unusual.


Dave

Replies are listed 'Best First'.
Re^2: Function for reading file
by shabird (Sexton) on Mar 28, 2020 at 13:11 UTC

    How can i use it without the word regex \W ?

      Is your goal really to match every character in the ASCII character set except for 0-9 and _ (underscore)? I couldn't suggest a better alternative without knowing exactly what you want. However, again if you're only working with ASCII and not Unicode, these expressions do the same thing, in slightly different ways:

      • [A-Za-z\W] - Match A-Z, or a-z or any character that is not A-Z a-z, 0-9, _. This reduces to matching all characters that are not 0-9, _.
      • [^_\d] - Match any character that is not _ or 0-9. Much simpler way to state the previous expression.
      • (?!_)\D - Don't match if the next character will be an underscore, and don't match if that character is 0-9. This one uses look-ahead to check first if the next thing would not be _, then advances the position in the string and checks if the current thing is not 0-9. It uses lookahead, and then look at semantics.
      • \D(?<!_) - Don't match if the current character is 0-9. Also if that character was _ (underscore) fail to match. This checks the character at the current position, and then after advancing the marker in the string looks back to see that it was also not underscore. It uses look-at, and then lookbehind semantics.

      Of these options the second one is certainly the easiest to read. But my point in my previous post was that I'm doubtful this is exactly what you want. It seems very suspect to allow matching \t, \n, (, ), ^, -, A, B, z, ' '(space), ','(comma), and so on, but to disallow any numeric digit and the underscore. It doesn't seem like it's doing what you want it to be doing. But you didn't make clear to me what it is that you actually want to do.

      Furthermore, if you are dealing with Unicode semantics, the number of characters that are matched by that pattern is enormous, and even weirder. If you suggested what you're trying to match we might be able to help come up with a more specific expression.


      Dave

      ... the word regex \W ...

      It's important to understand what you're dealing with. The  \W (that's big-W) character class (see perlrecharclass) matches any character that is not a  \w (little-w) character. The  \w characters are sometimes called "word" characters, but IIRC they originate with the set of characters that are allowed in a C- or Perl-language identifier; that's why  _ (underscore) is included, but  - (hyphen), for instance, is not. So  \W is better described as the anti-word regex!

      And I agree with davido's point here that if  [A-Za-z\W] really does the trick for you, then  [^_\d] is more clear, readable, maintainable, and IMHO preferable.

      Update: Made "identifier" into a Wikipedia link.


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

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://11114641]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (4)
As of 2020-06-05 04:12 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Do you really want to know if there is extraterrestrial life?



    Results (35 votes). Check out past polls.

    Notices?