3

whitespaces正規表現と照合した後、文字列に置き換えようとしています。

my $string = "watch download Buffy the Vampire Slayer Season 1 Episode 1 Gorillavid";

if ($string =~ m!(Season\s\d+\sEpisode\s\d+)!){

    $1 =~ s!\s+!!g;

    say $1;

}

上記のコードを実行すると、Modification of a read-only value attempted. 変数に値を格納すると$1、その変数で置換を実行しようとすると、正常に動作します。

それで、新しい一時変数を作成せずにその場で置換を実行できる方法はありますか?

PS:私ができないので、誰かが上記のコードをワンライナーとして書く方法を教えてもらえますか:)

4

5 に答える 5

6

特別な変数を台無しにしないで、必要なデータをキャプチャするだけで、構築は自分で出力します。

$string = "watch download Buffy the Vampire Slayer Season 1 Episode 1 Gorillavid";
if ($string =~ m!Season\s(\d+)\sEpisode\s(\d+)!){
   say("Season$1Episode$2");
}
于 2012-09-10T12:36:00.843 に答える
4

元の文字列内に圧縮Season 1 Episode 1したいようですSeason1Episode1

これは、左辺値としての呼び出し@-@+一緒にandを使用して便利に実行できます。substr

このプログラムはアイデアを示しています

use strict;
use warnings;

my $string = "watch download Buffy the Vampire Slayer Season 1 Episode 1 Gorillavid";

if ($string =~ /Season\s+\d+\s+Episode\s+\d+/ ) {

  substr($string, $-[0], $+[0] - $-[0]) =~ s/\s+//g;
  print $string;
}

出力

watch download Buffy the Vampire Slayer Season1Episode1 Gorillavid

なぜこれを一行で書きたいのかは言いませんが、そうしなければならない場合は、これでうまくいきます

perl -pe '/Season\s*\d+\s*Episode\s*\d+/ and substr($_, $-[0], $+[0] - $-[0]) =~ s/\s+//g' myfile
于 2012-09-10T12:39:21.370 に答える
2

ポストスクリプトforループを使用してのローカルインスタンスを作成する場合は$_、置換を印刷(コンマを使用)でチェーンして、一致の印刷前処理を実行できます。

/gグローバルオプションを使用する場合、括弧は必要ないことに注意してください。また、これによりifステートメントが冗長になることに注意してください。これは、一致しない場合は空のリストがforループに返されるためです。

perl -nlwe 's/\s+//g, print for /Season\s+\d+\s+Episode\s+\d+/g;' yourfile.txt

スクリプトでは、次のようになります。ifステートメントがforループに置き換えられていることに注意してください。

for ( $string =~ /Season\s+\d+\s+Episode\s+\d+/g ) {
    s/\s+//g;  # implies $_ =~ s/\s+//g
    say;       # implies say $_

}

これは主にワンライナーを示すためです。読みやすさを向上させたい場合$_など、を使用する代わりに字句変数を挿入できます。for my $match ( ... )

于 2012-09-10T16:51:41.710 に答える
1
$string =~ s{(?<=Season)\s*(\d+)\s*(Episode)\s*(\d+)}{$1$3$2};
于 2012-09-10T12:54:48.330 に答える
-1

これを試すことができます:

perl -pi -e 'if($_=~/Season\s\d+\sEpisode\s\d/){s/\s+//g;}' file

以下でテスト:

XXX> cat temp
watch download Buffy the Vampire Slayer Season 1 Episode 1 Gorillavid
XXX> perl -pi -e 'if($_=~/Season\s\d+\sEpisode\s\d/){s/\s+//g;}' temp
XXX> cat temp
watchdownloadBuffytheVampireSlayerSeason1Episode1GorillavidXXX>
于 2012-09-10T12:39:02.383 に答える