1

ファイルから読み取ろうとしています。ここに私のファイルがどのように見えるか..

  abc123
      abdef012
    fedabc_23
        xyz12
  12345

今、私がやろうとしているのは、コマンドラインからオプションを取得し、*、?、+ 上記のファイルからの適切な行などの入力されたワイルドチャーに従って、出力することです。しかし、私はここで立ち往生しています。知っている。* のしくみですが、他のワイルド文字についてはわかりません。助けてください。

 #/perl/bin/perl
 use Getopt::Long;
 open (DATA, "filname.txt") || die "Can't open the file:$!";

 my $fil='';

 my $res= GetOptions (
"f=s" =>\$fil
);
$fil=~ s/[\*]//g;  #Works only if '*' is at the end

 /(\w*$fil\w*)/ && !$seen{$1}++ && push @arr, $1 while <DATA>;

他のワイルドカードも使用するには? これを一般化する方法は?

4

2 に答える 2

3

これをまっすぐにさせてください:

ファイルがあり、正規表現を入力して、その表現に一致するすべての行を出力したいですか? みたいなgrep

use strict;
use warnings;
use autodie;

my $regex = shift;
my $file  = shift;

open my $fh, "<", $file;  #Autodie will handle not being able to open files...
while ( my $line = <$fh> ) {
    print $line if $line =~ /$regex/;
}
close $fh;

globbingまたは、正規表現ではなく使用しようとしていますか?

グロブに一致するか、グロブを正規表現に変換するText::Globと呼ばれる Perl モジュールがあります。

私はそれを使用したことはありませんが、非常に単純に見えます:

use strict;
use warnings;
use autodie;
use Text::Glob qw(match_glob);

my $glob = shift;
my $file  = shift;

open my $fh, "<", $file;  #Autodie will handle not being able to open files...
while ( my $line = <$fh> ) {
    print $line if match_glob( $glob, $line );
}
close $fh;
于 2013-07-19T13:59:22.610 に答える
1

記号*は、先行する文字が 0 個以上あることを意味するため、またはまたはd*xと一致します。ddddddddxdxddx

記号+は、前の文字の 1 つ以上に一致することを意味し、sotはorまたはd+xにも一致します。ddddddxdxddx

角括弧は文字クラスを定義するため、円記号[\*]または記号のいずれかに一致することを意味し*ます。正規表現の特殊文字の多くは、角括弧文字クラス内では意味を失います。したがって、または[\*]xに一致します。\x*x

直前の?文字と 0 回または 1 回一致する手段。一致d?xするdxか、x

.任意の文字に一致します。

これらのアイデアを組み合わせて'.*'、文字列の最初の引用符と文字列の最後の引用符の間のすべての文字 (間の引用符を含む) を検索する、使用できる引用符間の任意の文字に一致させることができます。または、2 つの引用符の間のテキストだけを一致させるには、 as in*を含めることで非貪欲にすることができます。?'.*?'

これらの所有量指定子がどのように機能するかについては、 http://www.regular-expressions.info/possessive.htmlで詳しく読むことができます。

于 2013-07-19T12:30:24.427 に答える