掲示板などで、投稿された名前などに入っている全角スペースを切り落としたいのです。

$name =~ s/\s+//g;

これでやってみたのですが、半角スペースしか切り落とせません。
全角スペースを切り落とすにはどのような方法がありますでしょうか?
自分なりに調べてみたんですが、わかりませんでした。
お時間ございましたら、教えていただけますでしょうか?
方法を紹介してあるURLだけでも結構ですので、よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

perlの正規表現で大文字と小文字を区別しない、修飾子があります。


「i」です。
私も試したことがないのですが、この修飾子を使えば出来るのではないかと
思っています。
是非試してみてください。

$name =~ s/ //i;
    • good
    • 0

入ってくるデータがEUCで、スクリプトもEUCなら


$name =~ s/ //g;
でそのままできますよ。
文字コードが違うならjcodeとか使って変換してから
というのもありですが、そんなのも面倒なので

$name =~ s/\x81\x40//g; …SJIS
$name =~ s/\xa1\xa1//g; …EUC

というのがいいのでは。
    • good
    • 1
この回答へのお礼

>入ってくるデータがEUCで、スクリプトもEUCなら $name =~ s/ //g;
でそのままできますよ。

実は、試してみたのですがダメだったのです。
しかし、これを書いたのが、jcodeで変換する前の部分だったので、ダメだったんですね。(^_^;)
sjisの文字コードで指定した方法でやってみたところ、上手くいきました。
ありがとうございました。

しかし、これってもしUNIXユーザの人が書き込んだら、全角スペースは切り取られないということでしょうか?
EUCの方も書いておいたほうがいいのでしょうか?

文字コード表があるURLとかってないんでしょうか?
もし、ご存知でしたら教えていただけますでしょうか?

ご返答に、さらに質問してしまってすみません。
もし、よろしけれご返答いただければ、幸いです。

お礼日時:2001/03/01 15:51

\s は、「 」(スペース=半角スペース)ですので、



それを、「 」(全角スペース)に置きかえれば?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
私も同じことを考えてやってみたのですが、ダメだったのでした。(T_T)
しかし、別の方法で解決いたしました。
ご親切にありがとうございました。

お礼日時:2001/03/01 15:54

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

Q全角ひらがな、漢字をマッチさせたい

Perlでフォームに入力された値をチェックするとき、入力される文字列は半角文字以外を入力されるとエラーになるスクリプトを書きたいと思っています。
(ただし、半角に出来る文字「カタカナ、記号等」は半角に変換するのでエラーでは無いとしたいです)

どうすれば実現出来るでしょうか。
よろしくお願いします。

Aベストアンサー

パターンマッチを利用することをオススメします。
とりあえず、余計なマッチミスを防ぐためにも、EUCコードに変換してから処理を行います。
参考URLのページに詳しく解説されています。
参考URLのページをみても分からなければ、補足をお願いします。

一応、主要な文字コードのパターンを記しておきます。
$nobashi = '(?:\xA1[\xBC\xBD\xC1])'; # ー-~
$kigo = '(?:[\xA1\xA2][\xA1-\xFE])'; # 全角の記号
$suuji = '(?:\xA3[\xB0-\xB9])'; # 0-9
$alphabet = '(?:\xA3[\xC1-\xDA\xE1-\xFA])'; # 全角英字
$alpha_big = '(?:\xA3[\xC1-\xDA])'; # 全角英字(大文字A-Z)
$alpha_small = '(?:\xA3[\xE1-\xFA])'; # 全角英字(小文字a-z)
$hiragana = '(?:\xA4[\xA1-\xF3])'; # ぁ~ん
$katakana = '(?:\xA5[\xA1-\xF6])'; # ァ~ヶ

参考URL:http://www.din.or.jp/~ohzaki/perl.htm

パターンマッチを利用することをオススメします。
とりあえず、余計なマッチミスを防ぐためにも、EUCコードに変換してから処理を行います。
参考URLのページに詳しく解説されています。
参考URLのページをみても分からなければ、補足をお願いします。

一応、主要な文字コードのパターンを記しておきます。
$nobashi = '(?:\xA1[\xBC\xBD\xC1])'; # ー-~
$kigo = '(?:[\xA1\xA2][\xA1-\xFE])'; # 全角の記号
$suuji = '(?:\xA3[\xB0-\xB9])'; # 0-9
$alphabet ...続きを読む

Qサーバーにある特定の拡張子ファイルをすべて検索

サーバー内にある、拡張子が「html」または「cgi」のファイルを全て検索して配列に代入するにはどうすればいいのでしょうか。
サブディレクトリも全て検索します。

よろしくお願いします。

Aベストアンサー

No.2の「/\.cgi|\.htm(l)?$/」は、「/\.cgi$|\.htm(l)?$/」です。
No.2だと、aaa.cgi.bbbのようなファイル名もOKになってしまいますね(汗

QPerl 先頭のスペースを複数削除

先頭の全角スペースを全部削除する場合の記述を教えてください。
$val="全角スペース全角スペース全角スペースあいうえお"

これだと先頭1文字しか削除できない。
$val =~ s/^ *//g;
※スペースは全角スペース

結果$valの中身
”あいうえお"

※Perlのバージョンが5.0のため「use utf8」 が使えないため 変換は「jcode.pl」を使っています。

Aベストアンサー

全角空白は 1 バイトではありません

JIS X 0201 での定義: 1面1区1点
iso2022jp でエンコード: 21 21
shift_jis でエンコード: 81 3f
euc-jp でエンコード: a1 a0

Unicode での定義: U+3000 IDEOGRAPHIC SPACE
utf-8 でエンコード: e3 80 80

というわけで、古い perl は1文字=1バイトの前提でしょうから
誤: s/^空+//g
正: s/^(空)+//g

shift_jis の場合は、更に一手間かける必要があります。

Q文字列末尾のスペースを切り捨てるには?

Perlの初心者です。$xxxx という変数の値がどういう訳か、その末尾に半角スペースを含んでしまい、これを捨てる方法が分からなくて困っています。どなたかお教え下さい。

Aベストアンサー

末尾に半角スペースが1文字という前提です。
chop $xxxx; としてください。
chop は最後の1文字を取り除きます。

Qディレクトリ名を取得したい

perlでディレクトリ名だけを取得したいのですが、
なかなかうまい方法が見つかりません。
ファイル名を取得する・・・というのは結構あるのですが、
ディレクトリ名だけ、というのがどうもわかりません。

ちなみにファイル名取得は以下のようにやっています。
my $md;
opendir(DIR, 'q');
while (defined($dir = readdir(DIR))) {
$md=substr($dir,0,6);
}
closedir(DIR);

ディレクトリ名だけを取得・・・というのはどうやればよいのでしょうか。

Aベストアンサー

ファイル名の取得で例示されているものは、ファイル名だけの取得できてませんよね?
質問者さんが書かれているスクリプトだと、
DIRの中にある「何か」の「たまたま」一番最後に入っていたものの「0文字目~6文字目」までを取得するスクリプトになっているのわかりますか?

my @file;
my @directory;
my $check_dir = "./q/";
$ct =0;
opendir(DIR,$check_dir);
while( defined($temp=readdir(DIR))){
#カレントディレクトリまたは上位ディレクトリの場合はパス
if( $temp eq '.' || $temp eq '..' ){ next;}
#ファイルの場合
if( -f $check_dir.$temp ){
push @file, $temp;
}
#ディレクトリの場合
if( -d $check_dir.$temp ){
push @directory, $temp;
}
}

$check_dirに設定されているディレクトリに格納されているファイルは@fileに、ディレクトリは@directoryに格納されます。

ファイル名の取得で例示されているものは、ファイル名だけの取得できてませんよね?
質問者さんが書かれているスクリプトだと、
DIRの中にある「何か」の「たまたま」一番最後に入っていたものの「0文字目~6文字目」までを取得するスクリプトになっているのわかりますか?

my @file;
my @directory;
my $check_dir = "./q/";
$ct =0;
opendir(DIR,$check_dir);
while( defined($temp=readdir(DIR))){
#カレントディレクトリまたは上位ディレクトリの場合はパス
if( $temp eq '.' || $temp eq '..' ){...続きを読む

Qperlで配列の要素が空なのを知るには?

教えてください。

例えば、perlの次の様な要素が3つある配列で、

@t = ('A',,'C');

2要素目が空で有ることを判別したいのですが、どうしたら良いでしょうか?

Aベストアンサー

'' と比較する.

QPerlで変数を使用した置換ができない

ファイル内の「1 2 3 4 5」などの数字の箇所を、「1回 2回 3回 4回 5回」のように、「回」をつけた形に変えることを考えています。
以下のようなスクリプトを書きましたが、うまくいきません。

# 「$search_replace」の参照先のテキストファイルの内容
(\d) タブ記号 $1回


EOF

# 問題のスクリプト(一部)
chomp($search_replace);
(my $search, my $replace) = split(/\t/, $search_replace);
$string[$i+1] =~ s/$search/$replace/g; #ここが問題と思われる箇所

ほしい結果は右のとおり。「1回 2回 3回 4回 5回」
現実の結果は右のとおり。「$1回 $1回 $1回 $1回 $1回」

置換文字列の$1の部分がうまく展開(?)できないようです。
どうすればよいか、ご教示ください。

Aベストアンサー

正規表現の置換部はダブルクォート文字列と同様に評価されるので、次の2つの文は同じように機能します。質問のケースでは、変数を2重に置き換えなければならないので、明示的にダブルクォートが必要になります。

$string[$i+1] =~ s/$search/$1回/g;
$string[$i+1] =~ s/$search/"$1回"/eg;

QPerlでハッシュや配列で重複するキーについて

ハッシュで重複するキーが値となるので、このハッシュはabdの3つのキーしか存在しないということでしょうか?
%a = ('a'=>1, 'b'=>2, 'a'=>3, 'd'=>4);

また、配列の場合はabadと4つ数になるということでしょうか?
@a = ('a','b','a','d');

この場合配列で、重複する値を抽出するアルゴリズムが知りたいです。

Aベストアンサー

重複のチェックはこんな感じでいいでしょう。

@a = ('a', 'b', 'a', 'd');

for (@a) {
  if (defined $hash{$_}) {
    print $_, "が重複してます。\n";
    next;
  }
  $hash{$_} = 1;
}

QPerlで環境変数を設定するには

あるPathを環境変数として設定したい場合、
例)TNS_ADMIN=D:\Test\exe

たとえばMS-DOSなら、
set TNS_ADMIN=D:\Test\exe
と設定しますよね。

これと同じことをPerlでどうやればいいのかというのが質問です。

ENVモジュールを使って、
$ENV{TNS_ADMIN}=D:\Test\exe
としてみたものの、Perlを実行した後に確認してみるとセットされていないようでした。
(確認方法はPerlを実行したDOSプロンプトにて"set"を実行)

よろしくお願いします。

Aベストアンサー

>>破棄された後に確認しても、わかりません。
>どうにかその環境変数がセットされていることを確認する方法ってないのでしょうか?

perlで子プロセスを起動すれば確認できます。

例えば、NT系のOSであれば...

次のスクリプトを用意。
#!c:\perl\bin\perl.exe
$ENV{"TNS_ADMIN"}="D:\\Test\\exe";
system("cmd");

それを実行すると、コマンドプロセッサが表示されるので、
set[return]
すれば、子プロセスの環境変数が確認できます。
確認後、exit[return]すると、子プロセスが終了するので、
親プロセスたるperlも終了する。


人気Q&Aランキング