如何在Perl中的字符串中组合变量

时间:2018-10-02 18:42:44

标签: string perl

$name = "LPA";
$date= 39;

$file = "/pathtoFile/window/$name/cavin_l/'$name'_formula_24rw$date.csv";

我希望将$file设置为等于

/pathtoFile/window/LPA/cavin_l/LPA_formula_24rw39.csv

但是它将$ file设置为:

/pathtoFile/window/LPA/cavin_l/'39.csv

有人可以帮我找出我要完成的正确语法,但似乎无法理解吗?预先感谢。

4 个答案:

答案 0 :(得分:4)

您成为过时的'(引号)包装分隔符的受害者。

$name'_formula_24被解释为$name::_formula24,由于该变量未定义,因此将插入空字符串。

您应该将其更改为

$file = "/pathtoFile/window/$name/cavin_l/${name}_formula_24rw$date.csv"

引用man perldata:

  

Perl中有两个包装分隔符:双冒号(“ ::”)和   单引号(“'”)。普通标识符可以以   双冒号,并且可以包含由双精度分隔的多个部分   冒号。单引号有相似的规则,但例外   在标识符末尾它们是不合法的:也就是说,   “ $'foo”和“ $ foo'bar”是合法的,但“ $ foo'bar'”则不合法。

答案 1 :(得分:3)

一种方法是在变量名周围使用大括号,如下所示:

$file = "/pathtoFile/window/$name/cavin_l/${name}_formula_24rw$date.csv";

perldoc perldata

中描述了此语法
  

就像在某些shell中一样,您可以将变量名称括在大括号中,以   使其与后面的字母数字(和下划线)保持一致。

答案 2 :(得分:3)

字符串中的double quotes "..." 内插变量。然后的问题是,在您尝试使用变量名时,并没有清楚地描绘出变量名,并且解释器最终会寻找

$name::_formula_24rw

也就是说,包_formula_24rw中的变量$name;这是因为出于历史原因,变量名后面的'(因此'$name之后的$file仍然是interpreted as scope :: 。由于没有这样的变量,因此您以第一个'结尾,然后是$date的值。

最重要的要点:use warnings; 会抓住这一点。尝试运行

use warnings;
use strict;

my $name = "LPA";
my $date= 39; 

my $file = "/pathtoFile/window/$name/cavin_l/'$name'_formula_24rw$date.csv";

它会打印

  

在连接(。)中使用未初始化的值$ name :: _ formula_24rw或在...处使用字符串

始终在程序的开头始终有use warnings;use strict;


因此,请使用${...},其中{}分隔变量名称

my $file = "/pathtoFile/window/$name/cavin_l/${name}_formula_24rw$date.csv";

或从单独的字符串中将其拼凑起来

my $file = '/pathtoFile/window/' 
    . $name . '/cavin_l/' . $name . '_formula_24rw' . "$date.csv";

答案 3 :(得分:0)

像Perl中的大多数事情一样,有很多方法可以完成相同的任务。

您可以使用<?php require 'config.php'; if ($_SESSION['logged_in'] != 1 ){ $_SESSION['message'] = "Please login!"; header("location: /prac?error"); } else { $user=$_SESSION['lec']; } if (isset($_GET['done'])) { include 'done.php'; } if (isset($_GET['error'])) { include 'error.php'; } ?> <table > <tr> <td width="20%" align="center"> <?php $sql = "SELECT propic FROM lecturer WHERE username='$user'"; $result = $conn->query($sql); $row = $result->fetch_assoc(); ?> <img id="mainpropic" src="propics/<?php echo $row['propic'];?>" width="200px" height="200px" > </td> <td >&nbsp </td> <td> <form action="" method="post"> <table cellpadding="2" > <tr> <td> User Name: </td> <td> <?php echo $_SESSION['lec'];?> </td> </tr> <tr> <td> EC Number: </td> <td> <?php $sql = "SELECT ecnumber FROM lecturer WHERE username='$user'"; $result = $conn->query($sql); $row = $result->fetch_assoc(); echo $row["ecnumber"];?> </td> </tr> <tr> <td> Name: </td> <td> <?php $sql = "SELECT name FROM lecturer WHERE username='$user'"; $result = $conn->query($sql); $row = $result->fetch_assoc(); echo $row["name"]; ?> </td> </tr> <tr> <td> Email: </td> <td> <?php $sql = "SELECT email FROM lecturer WHERE username='$user'"; $result = $conn->query($sql); $row = $result->fetch_assoc(); echo $row["email"];?> </td> </tr> <tr> <td> Phone Number: </td> <td> <?php $sql = "SELECT phonenumb FROM lecturer WHERE username='$user'"; $result = $conn->query($sql); $row = $result->fetch_assoc(); echo $row["phonenumb"];?> </td> </tr> <tr> <td> Department: </td> <td> <?php $sql = "SELECT dept FROM lecturer WHERE username='$user'"; $result = $conn->query($sql); $row = $result->fetch_assoc(); echo $row["dept"];?> </td> </tr> <tr> </tr> <tr> <td> <input type="button" value="Edit Profile" class="btn btn-primary btn-sm" data-toggle="modal" data-target="#Modal"> </td> <td> </td> </tr> </table>来定义变量名的边界

{}

或者,您可以使用串联来连接字符串。

my $file1="/pathtoFile/window/$name/cavin_l/${name}_formula_24rw$date.csv";

这两种方法都会产生相同的结果。

my $file2="/pathtoFile/window/$name/cavin_l/" . $name ."_formula_24rw" . $date . ".csv";

输出

use strict;
use warnings;

my $name="LPA";
my $date="39";

my $file1="/pathtoFile/window/$name/cavin_l/${name}_formula_24rw$date.csv";
my $file2="/pathtoFile/window/$name/cavin_l/" . $name ."_formula_24rw" . $date . ".csv";

print "$file1\n$file2\n";