Переносимость скриптов на Perl и проверка будущего - PullRequest
5 голосов
/ 18 августа 2010

Из-за давления со стороны нашей группы, мы должны перенести более ста Perl-скриптов с Sparc на x86. Это означает изменение десятков линий Шебанга с #!/home/Perl/bin/perl -w на что-то другое, что является настоящей болью. Каков хороший способ сделать это (я не могу найти что-либо на Lycos )?

Кроме того, что происходит, когда мы вынуждены переходить с x86 на что-то другое (вроде Cray, я полагаю)? Есть ли какой-нибудь способ «заглянуть в будущее»?

Ответы [ 4 ]

11 голосов
/ 18 августа 2010

Это одна из причин, по которой многие люди рекомендуют использовать #!/usr/bin/env perl вместо #!/usr/bin/perl:

5 голосов
/ 18 августа 2010

Perl кроссплатформенный.Если ваш код не использует XS скомпилированный код или системные пути, средства и т. Д., С вами все будет в порядке.

У вас есть два варианта:

  1. Неиспользуйте линии shebang (perl yourscript.pl).
  2. find . -name '*pl' | xargs sed 's/#!\/home\/Perl\/bin\/perl -w/#!\/usr\/bin\/env perl/

В любом случае линия shebang не имеет ничего общего с используемой аппаратной платформой, и все соболочка, на которой вы работаете.

4 голосов
/ 18 августа 2010

Изменение линий Шебанга массово не так уж и плохо:

#! /usr/bin/perl

use warnings;
use strict;

use File::Find;

sub usage { "Usage: $0 dir ..\n" }

my @todo;
sub has_perl_shebang {
  return unless -f;
  open my $fh, "<", $_ or warn "$0: open $File::Find::name: $!", return;
  push @todo => $File::Find::name
    if (scalar(<$fh>) || "") =~ /\A#!.*\bperl/i;
}

die usage unless @ARGV;
find \&has_perl_shebang => @ARGV;

local($^I,@ARGV) = ("",@todo);
while (<>) {
  s[ ^ (\#!.*) $ ][#! /usr/bin/env perl]x
    if $. == 1;
  print;
}
continue {
  close ARGV if eof;
}

В зависимости от того, что у вас есть, s/// может потребоваться немного умнее, чтобы обращаться с такими переключателями, как -T, которые должны находиться на линии Шебанга.

Добавить опцию пробного запуска с несколькими изменениями, плюс интересное использование redo:

my $dryrun;
{
  die usage unless @ARGV;
  $dryrun = shift @ARGV, redo if $ARGV[0] eq "-n";
}

find \&has_perl_shebang => @ARGV;
if ($dryrun) {
  warn "$0: $_\n" for @todo;
  exit 1;
}
1 голос
/ 18 августа 2010

Другая альтернатива (может быть, проще, хотя я бы не хотел сказать «лучше»), конечно, это мягкая ссылка /home/Perl/bin/perl на то место, где будет действительный бинарный файл Perl в новых системах ... это возможно, только если выиметь эффективные средства массового администрирования системы, которые должны иметь большинство обычных компаний.

...