#!/usr/bin/perl open (T, ">out") or die "Can't open out $!\n"; printf(T "hello\n"); #### #!/usr/bin/perl open (T, ">out") or die "Can't open out $!\n"; printf( T "hello\n"); #### String found where operator expected at ./t.pl line 4, near "T "hello\n"" (Do you need to predeclare T?) #### (S) The Perl lexer knows whether to expect a term or an operator. If it sees what it knows to be a term when it was expecting to see an operator, it gives you this warning. Usually it indicates that an operator or delimiter was omitted, such as a semicolon. #### #!/home/toma/perl58i/bin/perl use strict; use warnings; use diagnostics; open (T, ">out") or die "Can't open out $!\n"; printf ( T "hello\n"); #### printf (...) interpreted as function at ./t.pl line 6 (#1) (W syntax) You've run afoul of the rule that says that any list operator followed by parentheses turns into a function, with all the list operators arguments found inside the parentheses. See perlop/Terms and List Operators (Leftward). #### #!/usr/bin/perl open (T, ">out") or die "Can't open out $!\n"; printf T "hello\n";