PERL 赋值问题(纯新手)

PERL 赋值问题(纯新手)

my $CONF = ($AccessLogFileName =~ s/\.txt/\.conf/);

$CONF的值怎么会是1
为什么不是字符串呢?


QUOTE:
原帖由 qianzhuo 于 2008-12-2 13:11 发表
my $CONF = ($AccessLogFileName =~ s/\.txt/\.conf/);

$CONF的值怎么会是1
为什么不是字符串呢?

你用的是s///。

s/// 操作符的返回值(在标量和列表环境里都差不多)是它成功的次数(如果与 /g 修饰词一起使用,返回值可能大于一)。如果失败,因为它替换了零次,所以它返回假(""),它等效于数字 0。

m// 操作符
在标量环境里,该操作符在成功时返回真(1),失败时返回假("")。在列表环境里使用,m// 返回一个子字串的列表,这些子字串匹配模式里的捕获圆括弧(也就是 $1,$2,$3 等等
这种情况想写成一行,应该怎么写啊?
是想把替换过的新字符串,放到一个变量里,写成一行应该怎么写呢?请赐教。谢谢


QUOTE:
原帖由 qianzhuo 于 2008-12-2 13:23 发表
这种情况想写成一行,应该怎么写啊?
是想把替换过的新字符串,放到一个变量里,写成一行应该怎么写呢?请赐教。谢谢

替换后的新字符串就是$AccessLogFileName。

写成一行好像没必要。
my $newfile= $AccessLogFileName if $AccessLogFileName =~ s/\.txt/\.conf/;

$AccessLogFileName =~ s/\.txt/\.conf/, my $newfile = $AccessLogFileName;


QUOTE:
原帖由 qianzhuo 于 2008-12-2 13:23 发表
这种情况想写成一行

记住:
你现在既然连写都不会写,
那么你将来必然也看不懂。

你又不是在出谜语,越难猜越好,为什么非要写在一行当中呢?
my $CONF = ($AccessLogFileName =~ s/\.txt/\.conf/);
改成:
(my $CONF = $AccessLogFileName) =~ s/\.txt/\.conf/);

操作符优先级问题导致。
谢谢各位,学会了。
(my $CONF = $AccessLogFileName) =~ s/\.txt/\.conf/);
这样的写法在书中见过,为的是讲解优先级,实际编程当中用似乎有点多余。


QUOTE:
原帖由 machine 于 2008-12-2 17:31 发表
(my $CONF = $AccessLogFileName) =~ s/\.txt/\.conf/);
这样的写法在书中见过,为的是讲解优先级,实际编程当中用似乎有点多余。

为什么会多余呢?多余在哪里,我怎么不觉得?
这里相当于2个操作:
my $CONF = $AccessLogFileName;
$CONF =~ s/\.txt/\.conf/;
对副本$CONF继续s///操作。


QUOTE:
原帖由 FinalBSD 于 2008-12-2 18:07 发表

为什么会多余呢?多余在哪里,

估计是把 =~ 和 = 的优先级记反了