为何将*\赋值为标量引用后无法实现print自动输出?
Perl中
*\="..."赋值$\后print不自动追加的问题解析 问题现象
通过类型glob赋值*\="..."设置输出记录分隔符$\后,调用无参数的print;仅输出$_内容,不会自动追加$\的值,但直接打印$\却能得到预期字符串:
*_="this works!"; print; # 输出`this works!` *\="this doesn't work :(", print; # 仅输出`this works!`,未追加`$\`内容 print$\; # 输出`this doesn't work :(`
核心原因
Perl的类型glob赋值规则导致了这个差异:
- 当给类型glob(如
*_、*\)赋值非引用的标量(如字符串)时,Perl会自动将其转换为标量引用,并赋值给对应类型glob的标量槽。 - 对于
$_:无参数的print;会自动处理$_的引用,解引用后输出内容,所以*_="..."能正常工作。 - 对于
$\:print函数在处理输出记录分隔符时,仅识别非引用的标量值。如果$\是标量引用,print会忽略它,不会自动追加。但直接打印$\时,Perl会对这个特殊变量自动解引用,所以能输出字符串内容。
解决方案
如果要保留*\="..."的赋值方式并让print自动追加$\,需要将$\从引用转换为普通字符串:
*\="this works now!"; $\ = $$\; # 解引用并重新赋值给$\ print; # 输出`this works!this works now!`
或者直接使用标准赋值方式设置$\,避免类型glob带来的引用问题:
$\="this works now!"; print; # 正常追加输出
内容的提问来源于stack exchange,提问作者Dom Hastings
相关产品推荐
相关产品推荐

