sfgroups
sfgroups

Reputation: 19109

Why does my Perl one-liner report "Bareword found where operator expected"?

I want to convert block size into MB. I am using the /e option in my substitution. When I add starting MB in substitution part it giving me the error.

e.g:

This works.

 echo "16777216 SELECT" |perl -lane 's#(\d+)(\s+SELECT)#$1/(1024*1024*2)#e; print'
8

This giving me the error.

echo "16777216 SELECT" |perl -lane 's#(\d+)(\s+SELECT)#$1/(1024*1024*2) MB $2#e; print'
Bareword found where operator expected at -e line 1, near ") MB"
        (Missing operator before MB?)
syntax error at -e line 1, near ") MB "
Execution of -e aborted due to compilation errors.

Any help fixing the second one?

Upvotes: 0

Views: 1768

Answers (2)

codaddict
codaddict

Reputation: 455122

Change

(1024*1024*2) MB $2

to

(1024*1024*2)."MB".$2

The /e modifier tells the engine to treat the substitution field as Perl code.

Upvotes: 6

Axeman
Axeman

Reputation: 29854

The /e switch turns the replace expression into a regular perl expression. You need to quote the ' MB' and use concatenation (.) .

's#(\d+)(\s+SELECT)#$1/(1024*1024*2) . q[ MB] . $2#e

Should work.

Upvotes: 3

Related Questions