2009-06-18 20 views
7

Tôi đang cố gắng để có được phản ứng của một cuộc gọi curl thành một biến trong perl.Làm thế nào để có được đầu ra của curl thành một biến trong Perl nếu tôi gọi nó bằng cách sử dụng backtics?

my $foo = `curl yadd yadda`; 

print $foo; 

không hoạt động. Khi tôi chạy lệnh này tại dòng lệnh, cuộc gọi curl sẽ in tất cả đầu ra của nó một cách chính xác trong thiết bị đầu cuối, nhưng biến không được lấp đầy với dữ liệu đó.

Có cách nào để thực hiện việc này mà không cần cài đặt và gọi đến thư viện Perl curl không?

Trả lời

12

Nó có thể gửi công cụ của nó để stderr. Hãy thử

my $foo = `curl yadd yadda 2>&1`; 
+0

Điều đó đã làm được! cảm ơn!. Tôi sẽ cung cấp cho bạn dấu kiểm nếu bạn có thể thêm một hoặc hai câu về những gì 2> & 1 thực sự làm và tại sao di chuyển nó từ stderr đến bất cứ điều gì & 1 được đổ nó vào biến. Cảm ơn rất nhiều! –

+1

2> foo có nghĩa là "chuyển hướng stderr vào tệp foo". & 1 có nghĩa là stdout, tức là, chuyển hướng stderr đến stdout.Bạn cũng có thể thực hiện theo cách khác: "> & 2" có nghĩa là "chuyển hướng stdout thành stderr". Để chuyển hướng cả stdout và stderr, bạn có thể sử dụng "> &", nghĩa là foocommand &> file_with_boththings.txt – sunny256

+0

Ký hiệu '2> & 1' có nghĩa là bộ mô tả tập tin 2 (stderr) được gửi đến cùng một nơi mà bộ mô tả tập tin 1 (stdout)) được gửi đến. Vì vậy, cả hai đầu ra tiêu chuẩn và lỗi tiêu chuẩn được ghi vào cùng một vị trí (đầu ra tiêu chuẩn). Và backticks của Perl nắm bắt đầu ra tiêu chuẩn của lệnh được thực hiện, do đó ... –

0

Hãy thử điều này:

$var = `curl "http://localhost" 2>/dev/null`; 
print length($var) 

curl hiển thị thông tin về tiến bộ stderr, chuyển hướng đến/dev/null làm cho nó dễ dàng hơn để xem những gì đang xảy ra.

-1

Có thể là một số đầu ra bạn muốn chụp nằm trong chuẩn err, không phải là chuẩn. Hãy thử điều này:

my $foo = system "curl http://www.stackoverflow.com"; 
print $foo; 
+1

điều này không làm những gì bạn nghĩ rằng nó. – Geo

0

này hoạt động trên hệ thống của tôi:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $output = `curl www.unur.com`; 

print $output; 

__END__ 

C:\> z1 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
"http://www.w3.org/TR/html4/strict.dtd"><html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 

, vv

+0

Tôi nghĩ rằng bạn có thể hiểu sai việc in ấn của curl cho bản in mà bạn có ở đó. Hãy thử in "OUTPUT = $ output" thay vào đó và xem bạn có nhận được kết quả đúng hay không. Tôi đã làm điều đó quá và nó in đầu ra curl và sau đó in "OUTPT =" vì nó không bao giờ có kết quả vào var. Tuy nhiên, câu trả lời ở trên là chính xác. –

+0

@ Dr.Dredel nếu tôi xóa câu lệnh in, tôi thấy thông tin tiến trình curl in thành tiêu chuẩn, nhưng không phải đầu ra của curl. Nếu tôi đặt in "OUTPUT = $ đầu ra", tôi nhận được OUTPUT =

+0

có lẽ đó là một số loại sự khác biệt nền tảng. Nó chắc chắn không in để stdout cho tôi, và câu trả lời tôi đã kiểm tra đã khắc phục vấn đề. –

3

Trong vỏ 2> phương tiện chuyển hướng fileno 2. Fileno 2 luôn là những gì một chương trình coi như stderr. Tương tự, fileno 0 là stdin và fileno 1 là stdout. Vì vậy, khi bạn nói 2>&1 bạn đang nói cho trình bao để chuyển hướng stderr (fileno 2) vào stdout (fileno 1). Kể từ khi các nhà điều hành backticks sử dụng vỏ để chạy các lệnh mà bạn chỉ định, bạn có thể sử dụng chuyển hướng vỏ, vì vậy

my $foo = `curl yadda yadda 2>&1`; 

đang nói curl để chuyển hướng sản lượng của nó vào stdout, và kể từ khi các nhà điều hành backtick bắt stdout, bạn sẽ có được những gì bạn đang tìm kiếm.

+0

cảm ơn ... lời giải thích của bạn là tốt hơn từ ngữ tốt hơn so với cái tôi chọn là câu trả lời đúng, vì vậy, tôi đang cho nó một uptick :) –

4

Bạn thực sự muốn làm gì? Sử dụng curl bằng mọi giá hoặc lấy nội dung của một trang web?

Một cách Perlish hơn để làm điều này (mà dựa vào không có chương trình bên ngoài mà có thể hoặc không thể được cài đặt trên máy tiếp theo mà bạn cần phải làm điều này) sẽ là:

use LWP::Simple; 

my $content = get("http://stackoverflow.com/questions/1015438/") 
    or die "no such luck\n"; 

Nếu bạn muốn xem tại sao GET thất bại, hoặc lấy nhiều trang từ cùng một trang, bạn sẽ cần phải sử dụng nhiều máy móc hơn một chút. perldoc lwpcook sẽ giúp bạn bắt đầu.

+1

cảm ơn! rất tiện dụng. –

0

Bạn có thể mở một đường ống như thể đó là một tệp.

$url = "\"http://download.finance.yahoo.com/d/quotes.csv?s=" . 
"$symbol&f=sl1d1t1c1ohgvper&e=.csv\""; 

open CURL, "curl -s $url |" or die "single_stock_quote: Can't open curl $!\n"; 
$line = <CURL>; 
close CURL; 
Các vấn đề liên quan