4

分割関数でマップを使用して構成要素をトリミングするにはどうすればよいですか:$ a、$ b、$ c、および$ d; $ lineの?

my ($a, $b, $c, $d, $e) = split(/\t/, $line);

# Perl trim function to remove whitespace from the start and end of the string
sub trim($)
{
    my $string = shift;
    $string =~ s/^\s+//;
    $string =~ s/\s+$//;
    return $string;
}
4

6 に答える 6

4

必要($)でない限り、関数でプロトタイプを使用しないでください。

my ( $a, $b, $c, $d, $e ) =
  map {s/^\s+|\s+$//g; $_}    ## Notice the `, $_` this is common
  , split(/\t/, $line, 5)
;

s///上記の戻り値が置換カウントであることを忘れないでください- ではありません$_。したがって、明示的に行います。

またはもっと簡単に:

my @values = map {s/^\s+|\s+$//g; $_}, split(/\t/, $line, 5), $line
于 2010-07-02T03:09:21.413 に答える
3

map次の 2 つの入力を受け取ります。

  • 式またはブロック: これはトリム式になります (独自に記述する必要はありません。CPAN にあります)。
  • および操作対象のリスト: これはsplitの出力である必要があります:
use String::Util 'trim';
my @values = map { trim($_) } split /\t/, $line;
于 2010-07-02T02:50:30.730 に答える
2

これはうまくいくはずです:

my ($a, $b, $c, $d, $e) = map {trim ($_)} (split(/\t/, $line));

余談ですが、$a や $b を変数名として使うべきではありません。

于 2010-07-02T02:44:34.497 に答える
1

ここで「foreach」を使用することもできます。

foreach my $i ($a, $b, $c, $d, $e) {
  $i=trim($i);
}
于 2010-07-02T08:10:04.243 に答える
0

弦をトリミングするとき、元の状態を維持したくないことがよくあります。サブルーチンの抽象化があればいいのですが、一時的な値に煩わされる必要もありません。

perlsubが説明しているように、まさにこれができることがわかりました:

渡された引数は配列に表示され@_ます。したがって、2 つの引数で関数を呼び出した場合、それらは と に格納され$_[0]ます$_[1]。配列@_はローカル配列ですが、その要素は実際のスカラー パラメーターのエイリアスです。特に、要素$_[0]が更新されると、対応する引数が更新されます (更新できない場合はエラーが発生します)。

あなたの場合trim

sub trim {
  for (@_) {
    s/^ \s+  //x;
    s/  \s+ $//x;
  }
  wantarray ? @_ : $_[0];
}

mapと はいとこであることを覚えておいてくださいfor。したがって、 のループではtrim、 はもう必要ありませんmap。例えば

my $line = "1\t 2\t3 \t 4 \t  5  \n";    
my ($a, $b, $c, $d, $e) = split(/\t/, $line);    

print "BEFORE: [", join("] [" => $a, $b, $c, $d), "]\n";
trim $a, $b, $c, $d;
print "AFTER:  [", join("] [" => $a, $b, $c, $d), "]\n";

出力:

変更前: [1] [2] [3] [4]
後: [1] [2] [3] [4]
于 2010-07-02T14:52:02.867 に答える
0

多様性のためだけに:

my @trimmed = grep { s/^\s*|\s*$//g } split /\t/, $line;

grepリストのフィルターとして機能します。これが、正規表現内で s を s\s+に変更する必要がある理由です。\s*0 個以上のスペースで一致を強制するgrepと、先頭または末尾にスペースがないリスト内の項目が除外されなくなります。

于 2010-07-02T07:17:26.867 に答える