No.4ベストアンサー
- 回答日時:
細かいことですが、isgraphに対応するのは、
[:graph:]ではなくて、[:print:]じゃありませんか?
([:graph:]は0x20含んでますから)
sub isgraph {
my $key = shift @_;
$key =~ /^[\x21-\x7E]+$/ ? return 1 : return 0;
}
このような感じで書いておけば、
C同様、 if(isgraph($value)){ … } でいけます。
(エラーチェックなどは省略してますが)
コードを渡したいのであれば文字に変換を一行追加する必要がありますけれど。
$uint = 0x20;
if(pack("C",$uint) =~ /[[:graph:]]/){
print 'TRUE';
} else {
print 'FALSE';
}
は、natsuki_tkさんと異なる結果で、Cと同じくFALSEを得ることができました。
ロケールの違いでしょうか。
上の訂正がこのことでしょうか?
でも、natsuki_tkさんの/[\x21-\x7E]/の方が速いでしょうし、
packも必要ないからそれを使うことにして、[:graph:] は使わないことにしました。
将来、isgraphの範囲の定義が変更されることを考えれば
[:graph:]を使用した方がいいんでしょうけど。
ありがとうございました。
No.6
- 回答日時:
>$c = ' '; # $c = ('c', 0x20);
>printf("'%s' is NOT a graphic character.\n", $c) if ($c !~ /[[:graph:]]/);
>はちゃんと真になりましたよ?
申し訳ありません。
印刷可能と表示可能を勘違いしておりました。
graph [:alnum:] [:punct:]
print [:alnum:] [:punct:] 空白
ですので、この場合[:graph:]で全く問題無いのですね(^^;
ろくに確認もせずすみませんでした。
No.5
- 回答日時:
お礼をどうもありがとうございます。
まず、補足くださった疑問点から片付けていきましょう。
>[]の2重についてのことが分からないんですが、正規表現の
>[abc] #aかbかcのorという意味
>というorの意味が、/[[:graph:]]/の内か外の[]にあてはまりますか?
文字クラスの意味は、No.2 の方のご説明通りです。「[:alpha:]」を例にとって考えれば、
「[[:alpha:]]」は「[ABC..Za..z]」のように要素を列挙するのではなく、
「[A-Za-z]」のように範囲指定しているものだと思います。だから、
>[:graph:]でひとつの文字クラスです。文字クラスは[]で囲んで表現しますから、
>[[:graph:]]でワンセットです。
便宜的に「[:alpha:]」は「A-Za-z」に置き換わると考えてください。
つまり、「/[[:alpha:]]/」として初めて「/[A-Za-z]/」の意味になります。
これを角括弧を外して、「/A-Za-z/」と書いては意味を成しませんね。
ですから、以下のコードは間違いということになります。
>if ($c =~ /[:graph:]/) {...}
次はPOSIX モジュールを使う場合の補足です。
回答 No.3 のように書くと POSIX 準拠の関数すべてがインポート(輸入)
されてしまいますので、無駄を省くために
use POSIX qw(isgraph); # isgraph のみインポート
または
use POSIX qw(:ctype_h);
# 標準ヘッダ ctype.h で定義されているシンボルをすべてインポート
としてください。
それから、if や unless は文修飾子として用いたほうが一層効率的です。
printf("'%s' is a graphic character.\n", $c) if ($c =~ /[[:graph:]]/);
最後に No.4 の方のご指摘について。
>細かいことですが、isgraphに対応するのは、
>[:graph:]ではなくて、[:print:]じゃありませんか?
>([:graph:]は0x20含んでますから)
そうなのですか?Cでの定義とは異なりますね。
(Cの is 系関数は文字1個しか引数に取れないところも違いますが)
でも、手元の Perl v.5.6.1(Turbolinux Workstation 8.0 上の)では、
$c = ' '; # $c = ('c', 0x20);
printf("'%s' is NOT a graphic character.\n", $c) if ($c !~ /[[:graph:]]/);
はちゃんと真になりましたよ?
ホワイトスペースは定義通り弾かれているようですが。
[]が2重になる理由が理解できました。
POSIXは使ったことがなくて分かりませんでしたが、Perlへの移植が成功したのでまんぞくしました。
ありがとうございました。
No.3
- 回答日時:
こんにちは。
文字コードから文字への変換には pack 関数を使います。$c = pack('c', $uint);
そしてこの文字を使います。
if ($c =~ /[[:graph:]]/) {...}
こういう書き方もできるようです。
if ($c =~ /\p{IsGraph}/) {...}
ただし、文字としてありえない値を与えたときの挙動は両者で異なります。
前者は黙って無視しますが、後者は "Malformed UTF-8 character"
何とかかんとかというエラーが出ます。"$uint = 1000;" などで試してみてください。
おなじみの is 系関数を使いたいならば、POSIX モジュールを使うのが簡単でしょう。
use POSIX;
$c = pack('c', $uint);
if (isgraph($c)) {...}
参考URL:http://sk.redbit.ne.jp/~letzh/perl/sc/14.html
この回答への補足
こんにちは。
[]の2重についてのことが分からないんですが、正規表現の
[abc] #aかbかcのorという意味
というorの意味が、/[[:graph:]]/の内か外の[]にあてはまりますか?
あてはまるとすると、
if ($c =~ /[:graph:]/) {...}
のようなソースもありえることになると思いますが、
if ($c =~ /[:graph:]/) {...}
のようなソースはありえるんでしょうか?
is...のようなものは、必ず/[[...]]/のように、最低でも[]が2つ必要なんでしょうか?
No.2
- 回答日時:
ご質問が「isgraph()を使うようなシチュエーションで、Perlのやり方でうまくやりたい」のか、「Perlを使ってisgraph()とまったく仕様が同じ関数を実装したい」のかどちらなのか分からないので、前者と仮定してお答えします。
C言語ではcharが数値を保持する型であるため、文字の判定関数は引数をintで受けるものが多いようですが、Perlでは文字を扱う演算子や関数に数値を与えることはできません。そのため66ではなく文字リテラルで'B'と書く必要があります。
それから、[:graph:]でひとつの文字クラスです。文字クラスは[]で囲んで表現しますから、[[:graph:]]でワンセットです。
以下のコードを実行すると"True"と表示されます。
$uint = 'B';
if ($uint =~ /[[:graph:]]/) {print "True\n"}
この回答への補足
ありがとうございました。
[]の理解が間違っていたみたいで
$uint = 66;
if(pack("C",$uint) =~ /[[:graph:]]/){
print 'TRUE';
} else {
print 'FALSE';
}
のように[]を2重にするとできました。
Perlの:graph:の動作とは無関係で、C言語のisgraph()関数
の移植なんですが、ロケールは考えないとしてこれでいいですか?
No.1
- 回答日時:
int isgraph(int c);
次の文字に一致したらゼロ以外の値を、一致しなければゼロ返します
スペース ( ' ' ) を除く印字可能文字( ASCIIコードの0x21-0x7E )
この意味を考えて、Perl版を作成してください。
http://www1.cts.ne.jp/~clab/hsample/Func/Func05. …
参考URL:http://www1.cts.ne.jp/~clab/hsample/Func/Func05. …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript JAVASCRIPT 2 2022/04/15 15:10
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Perl Windows10においての『Perl』のプログラムについて 1 2022/05/09 16:04
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 画像の画素値を変えるC言語のプログラムで指定された画像の中に白い三角形を右上に表示させるにはどのよう 3 2022/10/30 01:16
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- その他(プログラミング・Web制作) HTMLを組み込むことができない言語 3 2022/05/21 10:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Jcode を使った複数選択値の文...
-
機種依存文字の文字コード変換
-
CSVファイルの中で、「 , 」カ...
-
英数字のみ全角から半角に変換
-
Excel VBAでPDFファイルをMicro...
-
データにカンマが入ったCSVデー...
-
カンマ区切り
-
EXCELからCSVにすると余計なカ...
-
正規表現で、特定の文字列を含...
-
CString Format にて全角空白文...
-
住宅にカナを入力する際に丁目...
-
テキストボックスの文字列を置...
-
Accessのテキストボックスの入...
-
Accessで日付や数値を全角で表...
-
COBOLでの全角文字の判定をした...
-
VB.net、テキストボックス入力...
-
Word2007の全角文字、全角スペ...
-
Delphi6 Delimiterの使い方
-
エクセルで数値を全角文字(カ...
-
封筒の宛先で縦書きの書き方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
InputMan の imTextについて
-
ダブルクォート文字などをフォ...
-
正規表現でカンマを対象にする方法
-
文字実体参照が勝手に変換され...
-
常用漢字?でない文字を判定す...
-
文字化けを元に戻せますか?
-
戻り値の意味がわかりません…
-
チェックボックスの複数選択の...
-
「数値文字参照への変換するソ...
-
jcode.plについて
-
SUBMIT時の入力文字のURLエンコ...
-
半角カナを検出したい
-
utf-8のマシンでsjisのデータフ...
-
jcode.plのバグでしょうか?KCc...
-
Jcode.pmでの半角カナ→全角カナ...
-
文字をISO Lathin 1 文字コード...
-
機種依存文字の文字コード変換
-
パターンマッチ変換について
-
文字コード
-
index関数と英語文字
おすすめ情報