2010-10-20 101 views
0

我在bash中有這三行很好地工作。我想將它們添加到一些現有的Perl腳本,但我從來沒有使用Perl之前....(3行)from bash to perl?

有人可以爲我重寫它們嗎?我嘗試使用它們,因爲它們並沒有奏效

注意$SSH_CLIENT是你,如果你鍵入的bash(Linux)設置

users[210]=radek  #where 210 is tha last octet from my mac's IP 
octet=($SSH_CLIENT) # split the value on spaces 
somevariable=$users[${octet[0]##*.}]  # extract the last octet from the ip address 

回答

4

這些可能適合你。我注意到每條線的假設。

my %users = (210 => 'radek'); 

我假設你想要一個稀疏數組。哈希是Perl中稀疏數組的標準實現。

my @octet = split ' ', $ENV{SSH_CLIENT}; # split the value on spaces 

我認爲你還是想用環境變量SSH_CLIENT

my ($some_var) = $octet[0] =~ /\.(\d+)$/; 

你想要的最後一組從'.'到最後的數字。

  • 變量周圍的變量將賦值放入列表上下文中。
  • 在列表上下文中,匹配會創建所有「已捕獲」序列的列表。
  • 分配給列表上下文中的標量意味着只有表達式中的標量數從列表中分配。

至於在評論你的問題,你可以得到的變量進行哈希,通過:

$db = $users{ $some_var }; 

# OR--this one's kind of clunky... 

$db = $users{ [ $octet[0] =~ /\.(\d+)$/ ]->[0] }; 
+0

謝謝,你的假設是1001%正確的:-) – Radek 2010-10-20 04:55:07

+0

我怎麼能從'%users'分配我的名字,基於從SSH_CLIENT到$ db變量的最後一個字節?類似於'$ db = $ users [$ {octet [0] ## *。}]' – Radek 2010-10-20 05:03:35

+0

它給了我這個'使用implicit split到@_在./restoreSQLDb第177行棄用。 全局符號「@octet 「需要在./restoreSQLDb第178.行中顯式包名。」,其中代碼行是'my $ octet = split'',$ ENV {SSH_CLIENT}; my $ ddb = $ users {[$ octet [0] =〜/\.(\d+)$/] - > [0]};' – Radek 2010-10-20 05:29:25

3

說你已經得到一個運行時間參數你的IP在一個字符串中,

$macip = "10.10.10.123"; 
@s = split /\./ , $macip; 
print $s[-1]; #get last octet 

如果你不知道Perl,你需要使用它來工作,你將不得不去學習它。當然,你不會去問這個問題,並且每次在Perl中都需要問這個問題嗎?

+0

我保證我不會:-)我想更新現有的腳本,而不是輸入我的名字,它會識別它,當我從我的機器ssh。它提醒了我......我更新了這個問題'$ SSH_CLIENT'是一個運行時參數,如果我在bash中鍵入set,我可以得到它。 – Radek 2010-10-20 04:53:07