What am I missing? Very basic

I’ve been using Mathematica for many years, and suddenly this very basic issue crops up. Why do the first and second inputs evaluate correctly but the third doesn’t?

In[114]:= 

Select[{1, 2, 3, 4, 5}, # > 2 &]

Select[{1, 2, 3, 4, 5}, # > xx & /. xx -> 2]

Select[{1, 2, 3, 4, 5}, # > xx &] /. xx -> 2

Out[114]= {3, 4, 5}

Out[115]= {3, 4, 5}

Out[116]= {}

In the case of

Select[{1, 2, 3, 4, 5}, # > xx &] /. xx -> 2

the

 Select[{1, 2, 3, 4, 5}, # > xx &]

is evaluated first (it returns {} obviously) and then the replacement rule is applied to the result (again returning {}). The standard Mathematica evaluation sequence is to evaluate expressions from the inside out of the FullForm of the expression.

FullForm[Hold[Select[{1, 2, 3, 4, 5}, # > xx &] /. xx -> 2]]

returns

Hold[ReplaceAll[
  Select[List[1, 2, 3, 4, 5], Function[Greater[Slot[1], xx]]], 
  Rule[xx, 2]]]

and this shows that the ReplaceAll in this case is the outermost function–everything inside of it is evaluated first.

In contrast your second example,

FullForm[Hold[Select[{1, 2, 3, 4, 5}, # > xx & /. xx -> 2]]]

which returns

Hold[Select[List[1,2,3,4,5],ReplaceAll[Function[Greater[Slot[1],xx]],Rule[xx,2]]]]

has the replacement rule being applied within the Select’s second argument.

I hope this helps…