Is local a bad part in Perl?

Yuki Kimoto - SPVM Author - Nov 17 '22 - - Dev Community

Q. Is local a bad part in Perl?

A. In my opinion, Yes. local is a bad part in Perl. If I could re-implement Perl, I will not implement local.

local $foo;
Enter fullscreen mode Exit fullscreen mode

Q. Why does local a bad part?

A. This is because the variable that is the operand of local is a global variable although at a glance it looks like a local variable in C.

int32_t foo;
Enter fullscreen mode Exit fullscreen mode

Q. What should be used instead of local?

Using my in all Perl programs is recommended strongly.

my $foo;
Enter fullscreen mode Exit fullscreen mode

This is called a lexical variable. This is strange name we don't usually hear in daily life.

Q. Does local need to be used in current days.

Q. I want to say No, but in some cases, local is used in current days. One is to save and restore predefined global variable.

{
  # Save
  local @ARGV;
}

# Restore @ARGV at the end of the scope
Enter fullscreen mode Exit fullscreen mode

Tow is to get the whole content of a file.

my $content = do { local $/; <$fh>; };
Enter fullscreen mode Exit fullscreen mode

Ugly, user experience is worse than other programing languages, but most efficient way because Perl doesn't have the function to get the whole content of a file.

The efficient is sacrificed, the following code can be written.

my $content = join('', <$fh>);
Enter fullscreen mode Exit fullscreen mode

Q. Are there ways to restore lexical variables?

Yes, using Scope::Guard.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .