在 Perl 中将字符串变量附加到固定字符串

问题描述 投票:0回答:2

我有一个在提示时输入的变量:

my $name = <>;

我想附加一个固定字符串

'_one'
(在一个单独的变量中)。

例如如果

$name = Smith
那么它就变成
'Smith_one'

我尝试了几种不同的方法,但没有给我正确的结果,例如:

my $one = "${name}_one";

^ 当我打印出来时,

_one
出现在下一行,当我使用它时,_one根本不包括在内。

还有:

my $one = $name."_one";

^

'_one'
出现在字符串的 beginning 处。

并且:

my $end = '_one';
my $one = $name.$end;
or 
my $one = "$name$end";

这些都不能产生我想要的结果,所以我可能错过了一些与提示中输入的格式相关的内容。感谢想法!

string perl append
2个回答
33
投票

您的问题与字符串附加无关:当您读取一行(例如通过

<>
)时,记录输入分隔符包含在该字符串中;这通常是换行符
\n
。要删除换行符,
chomp
变量:

    my $name = <STDIN>; # better use explicit filehandle unless you know what you are doing
    # now $name eq "Smith\n"
    chomp $name;
    # now $name eq "Smith"

要将变量插入字符串,通常不需要使用的

${name}
语法。这些行都会将
_one
附加到您的字符串并创建一个新字符串:

    "${name}_one"  # what you used
    "$name\_one"   # _ must be escaped, else the variable $name_one would be interpolated
    $name . "_one"
    sprintf "%s_one", $name
    # etc.

这会将

_one
附加到您的字符串中,并仍然将其存储在
$name
:

    $name .= "_one"

0
投票

谢谢——这真的很有帮助。如果它可以帮助其他人尝试修复/设置从 Google Photos 或通过 WhatsApp 下载的文件的修改日期(它会删除所有 exif 数据),我使用了以下内容:

这将适用于“IMG-20170721-WA0009.jpg”格式的 WhatsApp 类型内容,并将小时、分钟和秒设置为 01 01 01

find . -name \* | perl -lne 'my $a=$_; s/[^\d]+(\d{4})(\d{2})(\d{2})-.*/$1$2$3/ && print "touch -t ${_}0101.01\ \"${a}\"" '

这修复了像“20170721_063856.jpg”这样的图像

find . -name \* | perl -lne 'my $a=$_; s/.*(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2}).*/$1$2$3$4$5.$6/ && print "touch -t $_\ \"$a\"" '
  • 再次只需添加
    | bash -x
    即可使其实际执行。如果您也在寻找视频/非 jpg,它们会搜索整个目录
© www.soinside.com 2019 - 2024. All rights reserved.