代码之家  ›  专栏  ›  技术社区  ›  Yevgeny Simkin

如果使用backtics调用curl,如何在Perl中将curl的输出转换为变量?

  •  8
  • Yevgeny Simkin  · 技术社区  · 16 年前

    我尝试将curl调用的响应转换为perl中的变量。

    my $foo = `curl yadd yadda`;
    
    print $foo;
    

    不起作用。当我在命令行运行这个命令时,curl调用会在终端中正确地打印它的所有输出,但是变量中没有填充该数据。

    有没有一种方法可以在不安装和调用perl curl lib的情况下做到这一点?

    8 回复  |  直到 11 年前
        1
  •  13
  •   sunny256    16 年前

    它可能会把它的东西发送到stderr。尝试

    my $foo = `curl yadd yadda 2>&1`;
    
        2
  •  5
  •   jiggy    16 年前

    你也可以考虑看看 LWP::UserAgent 甚至 LWP::Simple .

        3
  •  4
  •   dland    16 年前

    你真的想做什么?使用 curl 不惜一切代价,还是抓取网页的内容?

    一种更为Perlish的方法(它不依赖可能安装在下一台需要安装的计算机上的外部程序)是:

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

    如果你想知道为什么get失败,或者从同一个站点抓取多个页面,你需要使用更多的机器。 perldoc lwpcook 会让你开始的。

        4
  •  3
  •   Chas. Owens    16 年前

    壳中 2> 表示重定向文件2。fileno 2总是程序所看到的stderr。同样,fileno 0是stdin,fileno 1是stdout。所以,当你说 2>&1 您告诉shell将stderr(fileno 2)重定向到stdout(fileno 1)。由于backticks运算符使用shell运行指定的命令,因此可以使用shell重定向,因此

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

    告诉curl将其输出重定向到stdout,并且由于backtick运算符捕获stdout,所以可以得到所需的内容。

        5
  •  0
  •   brian-brazil    16 年前

    试试这个:

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

    curl 在stderr上显示进度信息,将其重定向到/dev/null可以更容易地看到发生了什么。

        6
  •  0
  •   Sinan Ünür    16 年前

    这在我的系统上工作:

    #!/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">
    

    等。

        7
  •  0
  •   jpenkethman    11 年前

    可以像打开文件一样打开管道。

    $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;
    
        8
  •  -1
  •   pjb3    16 年前

    可能是您想要捕获的一些输出是标准错误,而不是标准输出。试试这个:

    my $foo = system "curl http://www.stackoverflow.com";
    print $foo;
    
    推荐文章