in reply to strange form in sub parameters

The * prototype forces the argument expression to be evaluated in scalar context. Furthermore, if the argument expression is an identifier but not an operator, the identifier will be passed as a string ("auto-quoted"). This allows one one to create subs with the same interface as open and read.

The $ prototype forces the argument expression to be evaluated in scalar context.

The semi-colon separates the required arguments (on the left) from the optional ones (on the right).

sysreadline($foo) Passes $foo sysreadline(FOO) Passes "FOO" sysreadline($foo, $bar) Passes $foo and $bar sysreadline(FOO, $bar) Passes "FOO" and $bar