人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Perlについて。

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

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

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

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


●質問者: tetlis
●カテゴリ:コンピュータ インターネット
✍キーワード:Perl test txt パス ファイル
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● tezcello
●10ポイント

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

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

◎質問者からの返答

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


2 ● kuro0680
●10ポイント

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


3 ● tkyk3
●30ポイント

ファイルパスは、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を使うとスマートかもしれません。

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

◎質問者からの返答

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

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

File::basementでも同じです。

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


4 ●
●20ポイント

とりあえず、以下のように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」が出力されます。

◎質問者からの返答

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


5 ● JULY
●30ポイント

ファイル名の取得

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

◎質問者からの返答

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ