0

我在文件 image1.hd 中有一行文本

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 的所需输出

我更喜欢一个衬里,因为我会做与其他一些文件类似的事情。早些时候我了解了模块 File::Slurp 并尝试了以下内容,并积极看待断言背后

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

这将返回 1 - 无论正则表达式如何。如何更改后一个正则表达式以实现所需的输出

4

2 回答 2

5

问题是您在标量上下文中使用赋值,这使得匹配返回匹配的数量。通过切换到列表上下文,您可以使用匹配组来返回所需的子字符串:

my ($axial_rot) = read_file("$Z_DIR/image1.hd") =~ /axial rotation:=(\S+)/;
于 2013-04-03T15:55:09.477 回答
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+)' );
于 2013-04-13T07:24:21.313 回答