use strict;
use warnings;

use Perl6::Slurp;
use File::Basename;
use File::stat;

my $name = basename($0);

die "Usage: $name 's/FIND/REPLACE/OPTS' FILE...n"
  if $#ARGV < 1;

my $op = "$text =~ " . (shift) . "mg";

push @ARGV, "-" if $#ARGV < 0;
foreach my $file (@ARGV) {
  my $text;
  if ($file eq "-") {
    $text = slurp *STDIN or warn "$name: could not read `$file': $!n";
  } else {
    if (!-e $file) {
      warn "$name: no such file `$file'n";
      next;
    } elsif (!-f $file) {
      warn "$name: skipping non-regular file `$file'n";
      next;
    }
    $text = slurp $file;
  }

  if (eval $op) {
    if ($file eq "-") {
      print $text;
    } else {
      my $stat = stat $file;
      system "mv", "-f", $file, "$file~";
      open FILE, ">$file" or warn "$name: could not write to `$file': $!n";
      print FILE $text;
      close FILE;
      chmod $stat->mode, $file or warn "$name: $!";
      chown $stat->uid, $stat->gid, $file or warn "$name: $!";
      warn "$name: changed `$file'n";
    }
  }
}