我在命令列中閱讀了一些引數:
#!/usr/bin/env perl
use 5.0360;
use warnings FATAL => 'all';
use autodie ':default';
use Devel::Confess 'color';
use Getopt::ArgParse;
my $parser = Getopt::ArgParse->new_parser(
help => 'This script finds and pretty-prints a line within a CSV file',
);
$parser-> add_args(
['-file', '-f', required => 1, type => 'Scalar'],
['-regex', '-r', required => 1, type => 'Scalar'], # regex pattern within each line
['-sep' , '-s', required => 0, type => 'Scalar']
);
my $args = $parser->parse_args(@ARGV);
my $sep = $args->sep // ',';
my $regex = $args->regex;
my @header;
say $args->regex;
open my $fh, '<', $args->file;
while (<$fh>) {
chomp;
if ($. == 1) {
@header = split $sep;
next
}
next unless /$regex/; # key point
say __LINE__;
# code later
}
這里的問題是正則運算式比較
next unless /$regex/
有效,但是
next unless /$args->regex/
不起作用,即使兩者是通過my $regex = $args->regex;
奇怪的是,我可以使用$args->file但不能使用$args->regex
為什么會這樣$args->regex作業?什么是正確的術語$args->regex?它不是哈希,它是某種物件。
uj5u.com熱心網友回復:
您不能將方法呼叫插入到字串中。我向你保證,這$args->file也行不通。請注意,這$args->regex不是欄位訪問,而是方法呼叫,相當于$args->regex().
在將變數插入到類似引號的背景關系(包括正則運算式)中時,您可以使用標量、陣列和陣列/哈希欄位訪問。
我認為使用命名變數my $regex = $args->regex是這里最清晰的解決方案。但是如果你真的想將任意運算式插入到字串中,你可以使用一個技巧:你可以插入陣列@foo,因此也可以使用陣列解參考@{ ... }。然后:
next unless /@{[ $args->regex ]}/;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/504249.html
標籤:perl
上一篇:寫入一系列perl陣列
