データベースから入力したPerl変数があります。その名前は $path
。別の変数を取得する必要があります$file
パス名からのファイル名だけが含まれます。
私は試した:
$file = $path =~ s/.*\///;
私はPerlにとても慣れていません。
なぜ車輪の再発明をするのですか? File :: Basename モジュールを使用します:
use File::Basename;
...
$file = basename($path);
$file=$path=~s/.*\///;
が機能しなかったのはなぜですか?
=~
は=
よりも 優先順位 高い
そう
$file = $path =~s/.*\///;
として扱われます:
$file = ($path =~s/.*\///);
これは、$path
で置換を行い、1
(置換が発生した場合)または''
(置換が発生しなかった場合)のいずれかを割り当てます。
あなたが欲しいものは:
($file = $path) =~s/.*\///;
これは、$path
の値を$file
に割り当ててから、$path
で置換を行います。
しかし、このソリューションには多くの問題があります。
正しくありません。 Unixベースのシステム(Windowsについては不明)のファイル名には、改行を含めることができます。ただし、デフォルトでは.
は改行と一致しません。したがって、.
が改行にも一致するように、s
修飾子を使用する必要があります。
($file = $path) =~s/.*\///s;
最も重要なのは、/
がパス区切り文字であると想定しているため、移植性がないことです。これは、Windows(\
を使用)、Mac(:
を使用)などの一部のプラットフォームには当てはまりません。したがって、モジュールを使用して、これらすべての問題を処理できるようにしてください。
これを行う最良の方法は-
use File::Basename;
my $file_name = basename($0);
したがって、変数$file_name
スクリプトの名前が付けられます
Path :: Class 最初はやり過ぎのように見えるかもしれません—ファイルとディレクトリパスのオブジェクトを作成します—しかし、それは複雑なスクリプトで実際に報われることができ、あなたが戻ったときにスパゲッティを防ぐたくさんのボーナスを提供しますスコープクリープによるコーナー。 File :: Spec は、パスを解決するための楽しみのために最初の例で使用されています。
use warnings;
use strict;
use Path::Class qw( file );
use File::Spec;
# Get the name of the current script with the procedural interface-
my $self_file = file( File::Spec->rel2abs(__FILE__) );
print
" Full path: $self_file", $/,
"Parent dir: ", $self_file->parent, $/,
" Just name: ", $self_file->basename, $/;
# OO
my $other = Path::Class::File->new("/tmp/some.weird/path-.unk#");
print "Other file: ", $other->basename, $/;
$url=~/\/([^\/]+)$/;
print "Filename $1\n";