2010-08-17 58 views
5

由于来自我们集团外部的压力,我们必须将超过一百个Perl脚本从Sparc移植到x86。这意味着将几十条线从#!/home/Perl/bin/perl -w改成其他的东西,这是一个真正的痛苦。什么是这样做的好方法(我在Lycos上找不到任何东西)?Perl脚本可移植性和未来打样

当我们被迫从x86移动到别的东西(比如Cray,我想)时会发生什么?有什么方法可以“面向未来”?

+3

Lycos仍在运行?呵呵。 – Ether 2010-08-17 23:34:19

+1

是的。为什么? – 2010-08-17 23:37:48

+0

@其他 - 他们这样做。 IIRC最后的老板是一些韩国公司。他们同时拥有HotBot聚合搜索(他们自己的+ MSN + ask.com搜索结果)和专有的LyGO“视觉搜索”引擎 - 这听起来有点酷,但是它使用了过时的旧Lycos搜索索引。 – DVK 2010-08-18 02:31:12

回答

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///可能需要有点聪明才能处理必须在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; 
} 
+0

非常好! 我是否在Sparc或X86上运行这个?我猜X86会更快。 – 2010-08-18 01:37:07

+0

@Ariel谢谢!你可以在x86(目标)端运行它,因为它在原地修复了shebang线。 – 2010-08-18 02:07:57

5

Perl是跨平台的。除非您的代码使用XS编译的代码或系统特定的路径,设施等,否则您应该没问题。

你有两个选择:

  1. 不要使用家当线(perl yourscript.pl)。
  2. find . -name '*pl' | xargs sed 's/#!\/home\/Perl\/bin\/perl -w/#!\/usr\/bin\/env perl/

在任何情况下,家当线无关,与你正在运行的硬件平台,以及所有你在运行shell。

+0

对不起。我应该说明我的壳。我正在使用'tcsh'这是我的问题吗? – 2010-08-17 23:36:53

+1

不,'tcsh'支持shebang行。如果你的系统安装了'env',你只需要用上面的选项2来改变你的脚本。 – 2010-08-17 23:39:39

+0

我不能保证运行脚本的系统安装了'env'。 – 2010-08-18 04:28:32

11

这是一个原因,许多人主张用#!/usr/bin/env perl代替#!/usr/bin/perl

+0

这是如何使我的脚本便携的? – 2010-08-18 04:27:20

+0

它们将通过'/ usr/bin/env'运行在系统找到的任何“perl”可执行文件上...... – mfontani 2010-08-18 06:02:34

+0

@Ariel:更具体地说,使用'#!/ usr/bin/env perl'将导致程序可以使用在控制用户的PATH中找到的第一个'perl'二进制文件运行。请注意,如果“x86”的意思是“Windows”,那么这与Windows无关,因为Windows通过文件扩展名完全忽略了“#!”这一行。 – 2010-08-18 11:24:21

1

另一种方法(可能比较简单,虽然我会毫不犹豫地说“好”)是的,当然,将/home/Perl/bin/perl软链接到新系统上实际的Perl二进制文件的任何位置......只有拥有大多数普通公司应该使用的高效批量系统管理工具才可行。

+0

什么是“高效批量系统管理工具”?我不认为我们有这个。 – 2010-08-18 04:29:30

+0

有些东西可以让你在每一台现有的和新的x86服务器上创建这样一个符号链接,而不需要单独服务器服务器(除非你只有2-3台服务器,在这种情况下可以手工完成) ) – DVK 2010-08-18 11:11:11