Perlについて。


パスを含んだファイル名の文字列から、
パスの部分を削除してファイル名だけ取り出すには、
どうすればよいでしょうか?

$value =~ s/.*\\//g;

とすると、
「$value ="C:\temp\test.txt";」は「test.txt」とうまく抜き出せるのですが、
「$value ="C:\temp\休暇申請書.txt";」は「請書.txt」となってしまいます。

どんなファイル名にも対応できる方法をお教えください。

回答の条件
  • 1人2回まで
  • 登録:2008/02/08 21:44:10
  • 終了:2008/02/15 21:45:03

回答(5件)

id:tezcello No.1

tezcello回答回数460ベストアンサー獲得回数692008/02/08 22:26:17

ポイント10pt

日本語を含む場合は、Shift-JIS だとうまくマッチしない(2バイト目に1バイト文字と同じコードを含むので)と思います。

文字コードをUTF-8にでも変換してからやってみてはどうでしょう?

id:tetlis

もともUTF-8でやっているのにこの状態です。

2008/02/14 15:54:43
id:kuro0680 No.2

kuro0680回答回数20ベストアンサー獲得回数02008/02/09 09:41:49

ポイント10pt

 Perlでは特に「申請書」の「申」という文字について、うまく処理できないクセがあります。

これは「申」の1バイト目の文字コードが「¥」(もしくは「/」)と同一なので、ここでのマッチ演算子でも、「申」の1バイト目とマッチしてしまっているのでしょう。

対策としては以下のものがあります。

 1 「休暇申請書」という文字を変数に代入する前に「休暇/申請書」という文字にしておく

 2 予め「申」の文字については別の文字に置き換えるようにアプリ内でしておく

 3 EUCにエンコードする

以下のページが非常に参考になります。

http://cocohome.hp.infoseek.co.jp/cocohome/l_moji.html

http://cocohome.hp.infoseek.co.jp/cocohome/l_moji2.html

id:tkyk3 No.3

tkyk3回答回数59ベストアンサー獲得回数62008/02/09 12:42:30

ポイント30pt

ファイルパスは、Windows対応だけでしょうか?

ファイルをアップロードするようなCGIを作っている場合、他のOSにも対応する必要はあるかと思います。Mac,UNIX,Windowsでそれぞれのファイルパスに対応するには、

use File::Spec;

$path = q(C:\aaa\bbb\data.txt);
($volume,$directories,$file) = File::Spec->splitpath( $path );
#$volume→C:
#$directories→\aaa\bbb\
#$file→data.txt

以上のように、File::Specを使うとスマートかもしれません。

あとは、このあたりを参考に…

id:tetlis

おそらくこれであっていると思うのですが、

Windowsのパスだと、ファイル名だけ取り出すことができずフルパスになってしまいます。

File::basementでも同じです。

その解決方法をまた質問してみることにします。

2008/02/14 15:56:39
id:bonlife No.4

回答回数421ベストアンサー獲得回数752008/02/09 20:28:31

ポイント20pt

とりあえず、以下のようにencodingを'shiftjis'と指定すれば、Shift-JISのどんなファイル名でも問題なく処理できます。

#!/usr/bin/perl

use strict;
use warnings;
use encoding 'shiftjis';
use File::Spec;

my $path = 'C:\temp\休暇申請書.txt';
my ($volume, $directories, $file) = File::Spec->splitpath($path);
print $file;

「休暇申請書.txt」が出力されます。

id:tetlis

サイト全体をUTF-8で作っているので、おそらく解決できないのではないかと思います。

2008/02/14 15:57:21
id:JULY No.5

JULY回答回数966ベストアンサー獲得回数2472008/02/09 21:34:58

ポイント30pt

ファイル名の取得

File::Basename モジュールが使えるなら、それが一番、確実ですが...

id:tetlis

おそらくこれでできるると思うのですが、

Windowsのパスだと、ファイル名だけ取り出すことができずフルパスになってしまいます。

その解決方法をまた質問してみることにします。

2008/02/14 15:57:39

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません