2013-04-03 25 views
0

我有一個文件image1.hd是什麼,這些正則表達式之間的差別 - perl的

axial rotation:=0.880157 

我要的號碼一行文字。使用Perl核心我這樣做

open FILE, "<", "$Z_DIR/image1.hd" or die $!; 
    while (<FILE>){ 
    if (/axial rotation:=(\S+)/) 
     { 
    $axial_rot = $1; 
     } 
    } 
    close FILE; 

它返回= 0.880157

所需的輸出我寧願一個襯墊,我會做一些類似的幾個其他文件。早些時候,我學到的模塊文件::嘟嘟地喝的,我試圖用背後斷言

my $axial_rot = read_file("$Z_DIR/image1.hd") =~ /(?<=axial rotation:=)\S+/ 

這將返回1正面看下面的 - 不管是正則表達式。我怎樣才能改變後者正則表達式來實現所需的輸出

+2

爲什麼要啜泣文件,除非你必須?你的軸向旋轉線是多線的表述嗎? – TLP

回答

5

的問題是您使用的是標量上下文的分配,這使得匹配返回匹配的數目。通過切換到列表環境裏,你可以使用一個匹配組返回所需的子:

my ($axial_rot) = read_file("$Z_DIR/image1.hd") =~ /axial rotation:=(\S+)/; 
0

你真的不應該在整個文件到內存中,除非你需要閱讀。

use strict; 
use warnings; 
use autodie; 

sub find_in_file{ 
    my($filename,$regex) = @_; 
    my @return; 

    open my $fh, '<', $filename; # or die handled by autodie 

    while(my $line = <$fh>){ 
    last if (@return) = $line =~ $regex 
    } 

    close $fh; # or die handled by autodie 

    return $return[0] unless wantarray; 
    return @return; 
} 

my $Z_DIR = '.'; 
my $axial_rot = find_in_file("$Z_DIR/image1.hd", qr'\baxial rotation:=(\S+)');