2010-08-17 2 views
5

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

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

+3

Lycos все еще работает? Да. – Ether

+1

Да, это так. Зачем? –

+0

@Ether - Они делают. IIRC последним владельцем была некоторая корейская компания. У них есть как совокупный поиск HotBot (их собственные + MSN + ask.com результаты), так и собственный механизм визуального поиска LyGO, который звучит немного круто, но использует тот же дерьмовый устаревший старый индекс поиска Lycos. – DVK

ответ

4

Изменение притон линии скопом не так уж плохо:

#! /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, которые должны быть на линии shebang.

Добавить вариант всухую с некоторыми изменениями, а также интересное использование 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; 
} 
+0

Очень приятно! Запустить это на Sparc или X86? Я думаю, что X86 будет быстрее. –

+0

@Ariel Спасибо! Вы запустили бы это на стороне x86 (адресата), поскольку он фиксирует строки shebang на месте. –

5

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

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

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

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

+0

Извините. Я должен был указать свою оболочку. Я использую 'tcsh', это моя проблема? –

+1

Нет, 'tcsh' поддерживает линии shebang. Если в ваших системах установлено 'env', вам просто нужно изменить свои сценарии с помощью опции 2 выше. –

+0

Я не могу гарантировать, что системы, на которых запущены наши скрипты, имеют 'env'. –

11

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

+0

Как это сделать мои скрипты переносимыми? –

+0

Они будут работать в зависимости от того, какой «perl» выполнит система, через '/ usr/bin/env' ... – mfontani

+0

@Ariel: В частности, использование' #!/Usr/bin/env perl' приведет к тому, что программа будет запускаться с использованием первого 'perl' бинарного файла, найденного в управляющем пользовательском' PATH'. Обратите внимание, что если «x86» означает «Windows», это не имеет никакого отношения, так как Windows идет по расширению файла и полностью игнорирует строку '#!'. –

1

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

+0

Что такое «эффективные инструменты администрирования массивной системы»? Я не думаю, что у нас это есть. –

+0

Что-то, что позволило бы создать такую ​​символическую ссылку на каждом существующем и новом сервере x86 без отдельного сервера за сервером (если, конечно, у вас всего 2-3 сервера, и в этом случае это возможно сделать вручную) – DVK

 Смежные вопросы

  • Нет связанных вопросов^_^