Question

Why this perl code is giving output "True"?

$bar = "\\";
if ($bar =~ /[A-z]/){
  print "True";
} else {
  print "False";
}

Shouldn't it return false?

Was it helpful?

Solution

Because \ is between A-z. See table below, 92 is between 65 and 122. Try [A-Z].

   0 nul    1 soh    2 stx    3 etx    4 eot    5 enq    6 ack    7 bel
   8 bs     9 ht    10 nl    11 vt    12 np    13 cr    14 so    15 si
  16 dle   17 dc1   18 dc2   19 dc3   20 dc4   21 nak   22 syn   23 etb
  24 can   25 em    26 sub   27 esc   28 fs    29 gs    30 rs    31 us
  32 sp    33  !    34  "    35  #    36  $    37  %    38  &    39  '
  40  (    41  )    42  *    43  +    44  ,    45  -    46  .    47  /
  48  0    49  1    50  2    51  3    52  4    53  5    54  6    55  7
  56  8    57  9    58  :    59  ;    60  <    61  =    62  >    63  ?
  64  @    65  A    66  B    67  C    68  D    69  E    70  F    71  G
  72  H    73  I    74  J    75  K    76  L    77  M    78  N    79  O
  80  P    81  Q    82  R    83  S    84  T    85  U    86  V    87  W
  88  X    89  Y    90  Z    91  [    92  \    93  ]    94  ^    95  _
  96  `    97  a    98  b    99  c   100  d   101  e   102  f   103  g
 104  h   105  i   106  j   107  k   108  l   109  m   110  n   111  o
 112  p   113  q   114  r   115  s   116  t   117  u   118  v   119  w
 120  x   121  y   122  z   123  {   124  |   125  }   126  ~   127 del

Use the following command to see ASCII chart:

man ascii

OTHER TIPS

$bar =~ /[A-z]/;

is not same as

$bar =~ /[A-Z]/;

Check all chars between A and z:

perl -le 'print map chr, ord("A") .. ord("z")'

ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz

Becauase you've written [A-z]:

See: http://perldoc.perl.org/perlrecharclass.html

[a-z]       #  Matches a character that is a lower case ASCII letter.

Try [A-Z] for uppercase, or [a-zA-Z] for both upper and lower case

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top