in reply to flock on on $^I

I tried this with constraints: I didn't want to use -i nor $^I.

Requirements:

File::Inplace
File::Flock.

A dir "in_place"
A file "abc.txt".
A file "adc.txt".
Both files should be in the dir "in_place".

#!/usr/bin/perl use strict; use warnings; use File::Copy; use File::Inplace; use File::Spec; use File::Flock; my $dir = '/root/Desktop/in_place'; my $data_dir = sub { File::Spec->catfile($dir, shift); }; my $abc_file = "/root/Desktop/in_place/abc.txt"; my $adc_file = "/root/Desktop/in_place/adc.txt"; lock($abc_file, 'shared', 'nonblocking'); lock($adc_file, 'shared', 'nonblocking'); my $edit = new File::Inplace(file => $data_dir->("abc.txt"), suffix => + ".log"); quick_change($edit, hello => 'jello'); $edit->commit; my $lock = File::Flock->new($edit); lock($lock, 'abc.txt.log'); lock_rename($lock, 'abc.txt.log'); unlock('abc.txt.log'); sub quick_change { my $edit = shift; my $from = shift; my $to = shift; while ($edit->has_lines) { my $line = $edit->next_line; if ($line eq $from) { $edit->replace_line($to); } } }
abc.txt:
hello
adc.txt:
jello

Replies are listed 'Best First'.
Re^2: flock on on $^I
by Anonymous Monk on Aug 19, 2010 at 13:53 UTC
    I had a go at doing it this way using a semaphore file. But I'm running into problems and can't figure out what is wrong.
    sub filelock; filelock "lockit"; Do the inplace edit stuff here filelock "unlock"; sub filelock { if ( @_ eq "lockit" ) { open(LCK,">abc.lock") or die "Can't open abc.lock: $! \n"; unless (flock LCK, LOCK_EX) { warn "Waiting to obtain lock on LCK ....\n"; flock(LCK, LOCK_EX) or die "Cannot lock semaphore file + - $!\n"; } } if ( @_ eq "unlock" ) { close(LCK) } }
    The problem is that it's not recognising "lockit" or "unlock" when the filelock subroutine is called. Even though when I print out @_ it displays "lockit" or "unlock" accordingly. What am I doing wrong ?
      fixed by adding this
      my $lockopt = shift; if ( $lockopt eq "unlock") { do stuff... }
      Being new to perl there's undoubtedly a better way of doing this !