グループ外からのプレッシャーのため、100を超えるPerlスクリプトをSparcからx86に移植する必要があります。これは、数十のシバンライン#!/home/Perl/bin/perl -w
を別のものに変更することを意味します。これは本当に苦痛です。これを行うための良い方法は何ですか( Lycosで何も見つかりません)?
また、x86から他の何か(Crayなど)に移動することを余儀なくされた場合はどうなりますか?「将来を保証する」方法はありますか?
グループ外からのプレッシャーのため、100を超えるPerlスクリプトをSparcからx86に移植する必要があります。これは、数十のシバンライン#!/home/Perl/bin/perl -w
を別のものに変更することを意味します。これは本当に苦痛です。これを行うための良い方法は何ですか( Lycosで何も見つかりません)?
また、x86から他の何か(Crayなど)に移動することを余儀なくされた場合はどうなりますか?「将来を保証する」方法はありますか?
Perl はクロスプラットフォームです。XS
コードがコンパイルされたコードやシステム固有のパス、機能などを使用しない限り、問題はありません。
次の 2 つのオプションがあります。
perl yourscript.pl
。find . -name '*pl' | xargs sed 's/#!\/home\/Perl\/bin\/perl -w/#!\/usr\/bin\/env perl/
いずれにせよ、シバン行は、実行しているハードウェア プラットフォームとは何の関係もありません。実行しているシェルとはすべて関係ありません。
シバン行をまとめて変更することはそれほど悪くありません。
#! /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 つの代替手段 (もっと簡単かもしれませんが、「より良い」とは言いたくありません) は、もちろん、/home/Perl/bin/perl
新しいシステム上の実際の Perl バイナリがある場所にソフトリンクすることです... 効率的な一括システム管理ツールがある場合にのみ実行可能です。ほとんどの通常の企業がすべきことです。