2016-01-19 17 views
5

tôi có thể làm toán nhưLàm thế nào để tôi nhận được dòng lệnh Perl để chấp nhận các biến shell?

perl -e 'print 5253413/39151' -l 

Nhưng tôi không hoàn toàn nhận được làm thế nào để tận dụng khả năng của Perl để làm toán với các biến bash được xác định trước của riêng tôi. Tôi đã thử

var1=$(some wc command that yields a number); var1=$(some wc that yields another number) 
perl -e 'print var1/var2' -l 

Nhưng nó không hoạt động

+0

Lý do nó không hoạt động là 'var1/var2' của bạn chỉ là văn bản cho Perl. Ngay cả sau khi sửa nó thành '$ var/$ var2', kịch bản không thể thấy rằng hai biến này được định nghĩa trong shell gọi kịch bản lệnh. Bạn phải chuyển giá trị của chúng sang tập lệnh theo một cách nào đó (ví dụ: biến môi trường, xem câu trả lời). – reinierpost

Trả lời

11

Có hai cách chính để làm điều này.

  • Trong mã Perl bạn có thể sử dụng %ENV built-in băm để truy cập các biến môi trường được xuất khẩu từ vỏ

    $ export var1=5253413 
    $ export var2=39151 
    $ perl -E 'say $ENV{var1}/$ENV{var2}' 
    134.183366963807 
    
  • Bạn có thể sử dụng các thiết bị vỏ suy để chèn giá trị của biến hệ vỏ thành lệnh

    Điều này được thực hiện tốt nhất làm thông số cho lớp phủ một lớp thay vì i ntroducing các giá trị trực tiếp vào mã

    $ var1=5253413 
    $ var2=39151 
    $ perl -E '($v1, $v2) = @ARGV; say $v1/$v2' $var1 $var2 
    134.183366963807 
    
+5

+1; cũng đáng nhắc đến phương pháp ad-hoc ngắn gọn, đơn giản hơn để xác định biến môi trường cho một lệnh: 'var1 = 5253413 var2 = 39151 perl -E 'nói $ ENV {var1}/$ ENV {var2}'' – mklement0

+1

@ mklement0 : Tôi đã xem xét việc bao gồm điều đó nhưng bác bỏ nó là tập trung vào kỹ thuật vỏ hơn Perl. Nhưng nhìn lại, tôi đoán đó là câu hỏi của câu hỏi này. Tôi sẽ để lại bình luận của bạn để đại diện cho nó. Cảm ơn bạn – Borodin

+1

Ngẫu nhiên, cách nhanh nhất (và bẩn nhất) để làm điều này chỉ là 'perl -e 'print' $ var1/$ var2 -l' – reinierpost

6

Hai cách ít phổ biến hơn để làm điều này làm cho sử dụng các tính năng từ lâu perl.

Đầu tiên là core module Env, mà quan hệ biến môi trường quá trình perl biến:

sh$ export VAR1=1000 
sh$ export VAR2=33 
sh$ perl -MEnv -E 'say $VAR1/$VAR2'   # imports all environ vars 
333.333333333333 
sh$ perl -MEnv=VAR1,VAR2 -E 'say $VAR1/$VAR2' # imports only VAR1, VAR2 
333.333333333333 

Lưu ý rằng các biến cần phải có mặt trong môi trường thừa hưởng bởi quá trình perl, ví dụ với export VAR như trên, hoặc một cách rõ ràng cho một lệnh (như là FOO=hello perl -MEnv -E 'say $FOO').

Cách thứ hai và khá mơ hồ hơn là sử dụng perl use của -s switch để thiết lập các biến tùy ý từ dòng lệnh:

sh$ VAR1=1000 
sh$ VAR2=33 
sh$ perl -s -E 'say $dividend/$divisor' -- -dividend=$VAR1 -divisor=$VAR2 
333.333333333333 

awk làm điều gì đó tương tự với -v switch của nó.

+0

Biến môi trường cũng có sẵn thông qua băm '% ENV' toàn cầu; 'shell # export FOO = BAR && perl -E 'nói $ ENV {FOO}'' – Joshua

+0

@Joshua, tất nhiên, nhưng nhiều tin tặc và quản trị viên perl cần một lớp lót chỉ là (ly) [quá thiếu kiên nhẫn] (http://c2.com/cgi/wiki?LazinessImpatienceHubris) để nhập '$ ENV {this}' và '$ ENV {that}'. :) – pilcrow

+0

Đây là một ý tưởng thực sự gọn gàng và tôi gần như muốn bỏ phiếu cho nó như là một câu trả lời. Nhưng, sẽ không chỉ sử dụng dấu ngoặc kép làm việc tốt? Đối với một số lý do câu trả lời này đã bị xóa, nhưng ai đó nói rằng bạn có thể làm 'perl -e 'in $ var1/$ var2" -l' – Tom

Các vấn đề liên quan