2010-08-17 23 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