由于来自我们集团外部的压力,我们必须将超过一百个Perl脚本从Sparc移植到x86。这意味着将几十条线从#!/home/Perl/bin/perl -w
改成其他的东西,这是一个真正的痛苦。什么是这样做的好方法(我在Lycos上找不到任何东西)?Perl脚本可移植性和未来打样
当我们被迫从x86移动到别的东西(比如Cray,我想)时会发生什么?有什么方法可以“面向未来”?
由于来自我们集团外部的压力,我们必须将超过一百个Perl脚本从Sparc移植到x86。这意味着将几十条线从#!/home/Perl/bin/perl -w
改成其他的东西,这是一个真正的痛苦。什么是这样做的好方法(我在Lycos上找不到任何东西)?Perl脚本可移植性和未来打样
当我们被迫从x86移动到别的东西(比如Cray,我想)时会发生什么?有什么方法可以“面向未来”?
更改家当线集体并没有那么糟糕:
#! /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///
可能需要有点聪明才能处理必须在shebang行上的交换机,例如-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;
}
非常好! 我是否在Sparc或X86上运行这个?我猜X86会更快。 – 2010-08-18 01:37:07
@Ariel谢谢!你可以在x86(目标)端运行它,因为它在原地修复了shebang线。 – 2010-08-18 02:07:57
Perl是跨平台的。除非您的代码使用XS
编译的代码或系统特定的路径,设施等,否则您应该没问题。
你有两个选择:
perl yourscript.pl
)。find . -name '*pl' | xargs sed 's/#!\/home\/Perl\/bin\/perl -w/#!\/usr\/bin\/env perl/
在任何情况下,家当线无关,与你正在运行的硬件平台,以及所有你在运行shell。
对不起。我应该说明我的壳。我正在使用'tcsh'这是我的问题吗? – 2010-08-17 23:36:53
不,'tcsh'支持shebang行。如果你的系统安装了'env',你只需要用上面的选项2来改变你的脚本。 – 2010-08-17 23:39:39
我不能保证运行脚本的系统安装了'env'。 – 2010-08-18 04:28:32
这是一个原因,许多人主张用#!/usr/bin/env perl
代替#!/usr/bin/perl
:
这是如何使我的脚本便携的? – 2010-08-18 04:27:20
它们将通过'/ usr/bin/env'运行在系统找到的任何“perl”可执行文件上...... – mfontani 2010-08-18 06:02:34
@Ariel:更具体地说,使用'#!/ usr/bin/env perl'将导致程序可以使用在控制用户的PATH中找到的第一个'perl'二进制文件运行。请注意,如果“x86”的意思是“Windows”,那么这与Windows无关,因为Windows通过文件扩展名完全忽略了“#!”这一行。 – 2010-08-18 11:24:21
另一种方法(可能比较简单,虽然我会毫不犹豫地说“好”)是的,当然,将/home/Perl/bin/perl
软链接到新系统上实际的Perl二进制文件的任何位置......只有拥有大多数普通公司应该使用的高效批量系统管理工具才可行。
什么是“高效批量系统管理工具”?我不认为我们有这个。 – 2010-08-18 04:29:30
有些东西可以让你在每一台现有的和新的x86服务器上创建这样一个符号链接,而不需要单独服务器服务器(除非你只有2-3台服务器,在这种情况下可以手工完成) ) – DVK 2010-08-18 11:11:11
Lycos仍在运行?呵呵。 – Ether 2010-08-17 23:34:19
是的。为什么? – 2010-08-17 23:37:48
@其他 - 他们这样做。 IIRC最后的老板是一些韩国公司。他们同时拥有HotBot聚合搜索(他们自己的+ MSN + ask.com搜索结果)和专有的LyGO“视觉搜索”引擎 - 这听起来有点酷,但是它使用了过时的旧Lycos搜索索引。 – DVK 2010-08-18 02:31:12