1

以下のような同様のエントリを含むリストを出力するperlスクリプトを作成しました。

$var = ' whatever'

$var には以下が含まれます: 一重引用符、スペース、任意の単語、一重引用符

実際、これはハッシュのキーであり、同じ値を取得したいと考えています。しかし、一重引用符と間にスペースがあるため、ハッシュキー値を取得できません。

だから、私は以下のように $var を削除したい:

$var = whatever

つまり、一重引用符、スペース、および末尾の一重引用符を削除します。

$var をハッシュ キーとして使用して、それぞれの値を取得できるようにします。

同じことの perl ワンライナーについて教えてくれませんか。

thnaks。

4

3 に答える 3

3

これを行うにはいくつかの方法がありますが、注意してください - ハッシュ内のキーを変更すると、次のような望ましくない結果が生じる可能性があります。

use strict;
use warnings;
use Data::Dumper;

my $src = {
    "a a"       => 1,
    " a a "     => 2,
    "' a a '"   => 3,
};
print "src: ", Dumper($src);
my $trg;

@$trg{ map { s/^[\s']*(.*?)[\s']*$/$1/; $_ } keys %$src } = values %$src;
print "copy: ", Dumper($trg); 

生成されます:

src: $VAR1 = {
          ' a a ' => 2,
          '\' a a \'' => 3,
          'a a' => 1
        };
copy: $VAR1 = {
          'a a' => 1
        };

YAPE::Regex::Explain モジュールで説明する任意の正規表現が可能です。(CPAN から)。上記の正規表現の場合:

use YAPE::Regex::Explain;
print YAPE::Regex::Explain->new( qr(^[\s']*(.*?)[\s']*$) )->explain;

生成されます:

正規表現:

(?-imsx:^[\s']*(.*?)[\s']*$)

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  ^                        the beginning of the string
----------------------------------------------------------------------
  [\s']*                   any character of: whitespace (\n, \r, \t,
                           \f, and " "), ''' (0 or more times
                           (matching the most amount possible))
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    .*?                      any character except \n (0 or more times
                             (matching the least amount possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
  [\s']*                   any character of: whitespace (\n, \r, \t,
                           \f, and " "), ''' (0 or more times
                           (matching the most amount possible))
----------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

要するに:s/^[\s']*(.*?)[\s']*$/$1/;意味:

  • 文字列の先頭では、可能な限り空白またはアポストロフィに一致します。
  • その後、何でも一致します
  • 文字列の空白またはアポストロフィの末尾を可能な限り一致させます
  • 「何か」の部分だけを残す
于 2012-07-20T08:37:29.980 に答える
2
#!/usr/bin/perl
$string = "' my string'";
print $string . "\n";
$string =~ s/'//g;
$string =~ s/^ //g;
print $string;

出力

' my string'
my string
于 2012-07-20T07:36:39.663 に答える
1
$var =~ tr/ '//d;

参照: tr 演算子

または、正規表現による

$var =~ s/(?:^['\s]+)|'//g;

後者は単語の途中にスペースを保持し、前者はすべてのスペースと一重引用符を削除します。

簡単なテスト:

...
$var = q{' what ever'};
$var =~ s/
         (?:     # find the following group
           ^        # at string begin, followed by      
           ['\s]+   # space or single quote, one or more
         )       # close group
         |       # OR
         '       # single quotes in the while string 
         //gx ;  # replace by nothing, use formatted regex (x)
print "|$var|\n";
...

プリント:

|what ever|

予想通り。

于 2012-07-20T07:44:10.767 に答える