DEV Community

Yuki Kimoto
Yuki Kimoto

Posted on

6

Is local a bad part in Perl?

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.

Do your career a big favor. Join DEV. (The website you're on right now)

It takes one minute, it's free, and is worth it for your career.

Get started

Community matters

Top comments (4)

Collapse
 
drhyde profile image
David Cantrell •

I generally use it if I want to temporarily over-ride a function:


{
local *Foo::Bar::baz = sub { ... };
...
}

It's far more convenient than saving, over-riding, and restoring, and also guarantees that the restore actually happens even if an exception means that the end of the block is never reached.

Collapse
 
yukikimoto profile image
Yuki Kimoto •

Thank for telling a local usage!

Collapse
 
vividsnow profile image
vividsnow •

You didn't mention usage like local delete $hash{key} or local $hash{key} = 'yadayada' which is convenient and more expressive than using of guards

Collapse
 
yukikimoto profile image
Yuki Kimoto •

OK. About the usage, the problem seems to be only naming.

Heroku

This site is powered by Heroku

Heroku was created by developers, for developers. Get started today and find out why Heroku has been the platform of choice for brands like DEV for over a decade.

Sign Up

👋 Kindness is contagious

Dive into an ocean of knowledge with this thought-provoking post, revered deeply within the supportive DEV Community. Developers of all levels are welcome to join and enhance our collective intelligence.

Saying a simple "thank you" can brighten someone's day. Share your gratitude in the comments below!

On DEV, sharing ideas eases our path and fortifies our community connections. Found this helpful? Sending a quick thanks to the author can be profoundly valued.

Okay