1

私はこれに腹を立てています。コードに示されているようにディレクトリパスを変更しようとしていますが、うまくいきません。何が間違っていますか?

私は期待$fulltitleしている\\mynas\data\music\FABRICLive\17 - Rhodes For D - Furney.mp3

my $find = 'C:\Users\Bell';
my $replace = '\\mynas\data\music';
my $fulltitle = 'C:\Users\Bell\FABRICLive\17 - Rhodes For D - Furney.mp3';
$fulltitle =~ s/$find/$replace/;
print ("$fulltitle\n");
4

3 に答える 3

5

引用メタ

use warnings;
use strict;

my $find      = quotemeta 'C:\Users\Bell';
my $replace   = '\\mynas\data\music';
my $fulltitle = 'C:\Users\Bell\FABRICLive\17 - Rhodes For D - Furney.mp3';
$fulltitle =~ s/$find/$replace/;
print("$fulltitle\n");

__END__

\mynas\data\music\FABRICLive\17 - Rhodes For D - Furney.mp3

警告は、何が間違っていたのかについての手がかりを与えていたでしょう.

于 2012-07-04T22:50:23.203 に答える
1

正規表現でパスを操作するのは面倒です。

use Path::Class::Dir qw();
use Path::Class::File qw();
my $old = Path::Class::Dir->new_foreign('Win32', 'C:\Users\Bell');
my $new = Path::Class::Dir->new_foreign('Win32', '\\\\mynas\data\music');
my $file = Path::Class::File->new_foreign('Win32', 'C:\Users\Bell\FABRICLive\17 - Rhodes For D - Furney.mp3');
$file->relative($old)->absolute($new)->stringify
# '\\mynas\data\music\FABRICLive\17 - Rhodes For D - Furney.mp3'

UNC パスでのディレクトリの表記を間違えました。文字列リテラルの二重バックスラッシュは、バックスラッシュでエスケープする必要があります。これが構文のしくみです。

于 2012-07-05T04:26:33.560 に答える
0
my $find      = 'C:\Users\Bell';
my $replace   = '\\mynas\data\music';
my $fulltitle = 'C:\Users\Bell\FABRICLive\17 - Rhodes For D - Furney.mp3';

$fulltitle    =~ s/\Q$find\E/${replace}/;
print "$fulltitle\n";

\Q一致でバックスラッシュ メタ文字を使用し\Eて無効にする必要があります。
コードパッドの例


注:置換は を に変換\\します\

于 2012-07-04T23:18:20.293 に答える