質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

1回答

2834閲覧

perl 文字列変換 半角スペース

toshihiko

総合スコア5

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2021/11/20 00:38

ただいまperlを勉強中です。

2個以上続く半角スペースを
1つの半角スペースに置換をしたいのですが

コード1 → エラー
コード2 → エラーなし

となります。

どうしてコード1ではダメなのでしょうか。
コードはif文とかの使い方も覚えたいので
冗長に書いています。

■コード1
if($line=~/\s\s+/){
$line=~s/\s\s+/\s/g;
}

■コード2
if($line=~/\s\s+/){
$line=~s/\s\s+/ /g;
}

以上です。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Crimson_Tide

2021/11/20 00:45

\sとは何を表すのか確認してみてください。 そして\sに変換しようとしていますが、それって具体的に何に変換されるのか? と考えてみるとエラーになることに納得がいくかと思います。
guest

回答1

0

ベストアンサー

use warnings; を付けると、その理由を Perl が教えてくれます。

perl

1use strict; 2use warnings; 3 4my $line = ' abc def'; 5 6if ($line=~/\s\s+/) { 7 $line=~s/\s\s+/\s/g; 8} 9print $line."\n"; 10 11#=> 12Unrecognized escape \s passed through at test.pl line 7. 13sabc def

つまり、置換文字列内の \s は正規表現としてではなく、バックスラッシュ + s という文字列(エスケープシーケンス)と見做されて処理されることになるのですが、\s というエスケープシーケンスは定義されていないので上記の様な結果(s という文字に置き換えられる)になります。

2個以上続く半角スペースを

ちなみに、以下の様に書く事もできます。

perl

1use strict; 2use warnings; 3use feature qw(say); 4 5my $line = ' abc def'; 6$line =~ s/\s{2,}/ /g; 7 8say $line; 9 10# 11 abc def

投稿2021/11/20 01:17

melian

総合スコア20655

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toshihiko

2021/11/20 22:57 編集

非常にご回答ありがとうございます! \sは定義されていないという事なんですね。 ありがとうございます。 一方、 $line=~s/\s\s+/\t/g; とするとタブには置き換えられるようです。 \sは認識されないけど、\tは認識されるなど 線引きがよく分かっていません。 $line=~s/\s\s+/\s/g; → NG $line=~s/\s\s+/\t/g; → OK この辺りの線引きを明確にするには どうするといいのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問