In reply to Rahulkumar:
I think the point you missed is the timing of when variable initialization happens in a declaration. A static variable gets initialized once before time 0. An automatic variable gets initialized each time the scope where variable where the variable is declared in gets activated. For both fork and begin blocks, this happens as soon as the parent process hits the fork or begin keywords (also the same for tasks or functions).
In the original example, there are no variables declared in the fork/join_none block. However, the variable l is declared inside the nested begin/end block process. The five sub-processes spawned by fork/join_none do not start executing until the parent process suspends or, as in this case, reaches the end. At that point the value of i is 5 for all the sub-processes. So all 5 copies of l get initialized to the value 5.
You can fix this by moving the declaration of l one scope level up
for(int i = 0; i < 5; i++)begin
automatic int l = i;
Or two levels as Rahulkumar suggested.